springboot中使用ApplicationRunner接口

2023-10-30

springboot中使用ApplicationRunner接口

applicationRunner使用

image-20220412095209582

Spring Boot如何解决项目启动时初始化资源,在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等。

实际操作:

原因:

​ 项目中某个接口速度过慢,然后需要加载字典表里面的数据进行left join ,如下图,进行了两次字典表的left join ,当Unit_info表数据量很大的时候,就会很慢。

操作:

​ 将字典表的数据一开始就加载进来,然后在单位表里面进行直接取出,剩下的value和name对应直接在service层处理了,不耽误mysql资源了。

image-20220412095537868

package com.gstanzer.microservice.unit.safety.common;

import com.gstanzer.microservice.unit.safety.common.mapper.SysDictMapper;
import com.gstanzer.microservice.unit.safety.common.po.SysDict;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Title: InitParamConfig
 *
 * @author wuwwangsheng
 * @version 1.0
 * @description: 初始化参数
 * @Copyright: Copyright (c) 2022
 * @Company: gstanzer
 * @date 2022年04月11日
 */
@Component
public class InitParamConfig implements ApplicationRunner {
    private static final Logger logger = LoggerFactory.getLogger(InitParamConfig.class);

    public static Map<String, Object> paramMap = new ConcurrentHashMap<>();
    @Resource
    private SysDictMapper sysDictMapper;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        logger.info("==========开始加载数据字典数据===========");
        List<SysDict> list = sysDictMapper.selectList(null);
        if(!CollectionUtils.isEmpty(list)) {
            for(SysDict sysDict:list) {
                setParamMap(sysDict);
            }
        }
        logger.info("==========结束加载数据字典数据===========");
    }


    public static String queryNameByValue(String paramType, String value) {
        if (StringUtils.isEmpty(value) || StringUtils.isEmpty(paramType)) {
            return "";
        }
        Object obj = paramMap.get(paramType + "-" + value);
        if (obj != null) {
            return obj.toString();
        }
        return "";
    }

    public static void setParamMap(SysDict sysDict) {
        paramMap.put(sysDict.getType() + "-" + sysDict.getValue(), sysDict.getName());
    }
}

作用:

在每次项目启动的时候

​ 本地启动:debug启动:+服务器上面sh start .sh

都会在

20:41:50.113 [main] INFO c.g.m.unit.safety.Application - Started Application in 22.742 seconds (JVM running for 24.118)

后面进行applicationRunner接口,实现初始化资源作用。

20:41:50.113 [main] INFO  c.g.m.unit.safety.Application - Started Application in 22.742 seconds (JVM running for 24.118)
20:41:50.125 [main] INFO  c.g.m.u.s.common.InitParamConfig - ==========开始加载数据字典数据===========
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7167ca15] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1118813413 wrapping com.mysql.cj.jdbc.ConnectionImpl@25c962b7] will not be managed by Spring
==>  Preparing: SELECT id,name,value,type,description,sort,parent_id,remark,del_flag FROM sys_dict 
==> Parameters: 
<==    Columns: id, name, value, type, description, sort, parent_id, remark, del_flag
<==        Row: 1, 一般单位, 1, unit_attribute, null, 1, 0, null, 0
<==        Row: 2, 宾馆(饭店), 2, unit_attribute, null, 2, 1, null, 0
    
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7167ca15]
20:41:50.298 [main] INFO  c.g.m.u.s.common.InitParamConfig - ==========结束加载数据字典数据===========
20:41:50.817 [RMI TCP Connection(2)-10.9.10.40] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
20:41:50.817 [RMI TCP Connection(2)-10.9.10.40] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
20:41:50.833 [RMI TCP Connection(2)-10.9.10.40] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 16 ms
问题:

这里接口的实现是在初始化dispatcherServlet之前做的处理?

.s.web.servlet.DispatcherServlet - Completed initialization in 16 ms


#### 问题:

> 这里接口的实现是在初始化dispatcherServlet之前做的处理?
>
> 在dispatherServlet之前就说明这个路径没走handlerMappering进行映射,直接在实现类里面进行操作的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot中使用ApplicationRunner接口 的相关文章

  • 使用SimpleMailMessage类发送邮件时如何使java字符串着色

    我正在使用 java 中的 SimpleMailMessage 类发送邮件 我将 spring 与 hibernate 结合使用 我想在发送邮件时将特定字符串设置为彩色 Code String emailBody Dear username
  • 使用 Spring Boot 的多模块 Maven 示例

    我想知道如何使用 Spring Boot 使用 Maven 创建一个多模块项目 有人能给我看一个 parent pom 和 child pom 的例子吗 Thanks 这个问题太简单无法回答或者太复杂难以理解 否则我无法解释为什么没有答案
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • mvn dependency:analyze 结果不正确

    我一直在寻找一种工具 它能够向您显示未使用的依赖项 我很快就偶然发现了 Maven 命令mvn dependency analyze 这样做的问题是 它经常检测到 未使用的 依赖项 如果缺失 这些依赖项就会导致构建失败 这是优化项目的示例
  • 如何通过keytool命令删除已经导入的证书/别名?

    我正在尝试通过 keytool 命令删除已导入的证书 keytool delete noprompt alias initcert keystore keycloak jks 但低于异常 keytool 错误 java lang Excep
  • 如何在 Android 中将 EditText 绘制到画布上?

    我想画画 EditText username new EditText context 到我画布上的特定位置 protected void onDraw Canvas canvas 是否可以在基础上画出x y在我的 Java 文件中协调而不
  • Java HttpURLConnection:内容长度计算

    我目前正在为 bitbucket issues RESTful API 开发一个库 我取得了很大的进步 现在我要解决这个部分更新问题 http confluence atlassian com display BBDEV Issues Is
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • Google Cloud:X-Cloud-Trace-Context 与应用程序日志traceId 不同

    我有一个部署在谷歌云中的 Spring Boot 应用程序 我面临一个相当奇怪的问题 X Cloud Trace Context 由谷歌设置 我想是负载均衡器 但应用程序级别日志的traceId具有不同的traceId 与我在邮递员的响应标
  • 如何提高 Guice 启动时的性能

    好吧 我知道我的计算不客观等等 但无论如何 我讨厌在执行单元测试时等待这么多时间 我的 guice swing 应用程序需要大约 7 秒来初始化 这是一个简单的 IRC 客户端 在那一刻 没有打开连接 我什至还没有调用任何 java io
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 使用 javax.mail 和 CentOS 的邮件服务器

    我有一个 Java 程序 安装在一台旧的 Ubuntu 机器上 并使用 javax mail 发送邮件 然而 那台机器宕机了 我现在在新的 CentOS 机器上运行相同的 Java 应用程序 但是 当我尝试使用 mail smtp host
  • 如何在最短的时间内克隆java中的输入流

    有人可以告诉我如何克隆输入流 并花费尽可能少的创建时间吗 我需要多次克隆输入流以使用多种方法来处理 IS 我尝试了三种方法 但由于这样或那样的原因 事情不起作用 方法 1 感谢 stackoverflow 社区 我发现以下链接很有帮助 并将
  • java3d 中的面部着色

    使用java3d 如何不在每个顶点基础上着色 而是在每个面基础上着色 我尝试学习 java3d 但我生成的 Shape3d 看起来并不符合预期 我想用不同的颜色给不同的三角形着色 但我不知道该怎么做 纹理看起来有点大材小用 而且我根本没有掌
  • 如何迭代SparseArray?

    有没有办法迭代 Java SparseArray 适用于 Android 我用了sparsearray通过索引轻松获取值 我找不到 看来我找到了解决方案 我没有正确注意到keyAt index 功能 所以我会这样做 for int i 0
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.type。使用 apache beam Spark runner 运行 go 示例时

    我想跑grades https github com apache beam tree master sdks go examples gradesapache beam go sdk 提出的示例 在一个主服务器和两个从服务器 spark2
  • 当我必须在 Netty4 编码器中调用 ByteBuf.retain() 时?

    我正在编写一个以 NUL 终止 JSON 消息的编码器 以便在消息碎片的情况下可以对其进行解码 我找到了这个样本 gt click https github com netty netty blob master codec src mai
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media
  • 1° 夏令时 Java 和 JS 表现出不同的行为

    假设巴西利亚 GMT 0300 夏令时于 21 10 2012 00 00 00 此时时钟应提前一小时 Java new Date 2012 1900 9 21 0 0 0 Sun Oct 21 01 00 00 BRST 2012 Chr

随机推荐