前言
需求,项目中有一些阈值,比如心率达到100,就报警。
数据过来之后要实时拿这些阈值去判断是否需要报警。
实现:
在项目启动的时候获取一下阈值表里的数据,做成单例。
同时如果阈值表里的数据更新,要提供一个刷新的接口刷新一下数据。
问题:
我在类里声明了类的静态变量,构造方法里调用了mybatis的Mapper层接口获取数据。
项目启动的时候报null
1 问题定位
其实是使用方法不对,静态变量会在一开始将数据加载到内存里,这个时候mapper还没有实例化,所以导致mapper为null。
2 解决方法
通过@Order(2)
注解,注解@Order的作用是定义Spring容器加载Bean的顺序
,我们在里面写了2,主要是为了预留,如果有优先级更高的,可以直接声明为1
,之后如果有新的需要处理的,可以写 2,4,6,8 ``这样如果新需求需要加入到其中某个位置,可以直接插入。
实现implements ApplicationRunner 接口
,重写run方法
,这个方法就是在项目启动之后会第一时间执行次方法。
5 源码案例
package com.jxj.init;
import org.java_websocket.client.WebSocketClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @program:
* @description: 项目启动后,第一时间运行的程序
* @author: Wang Hai Xin
* @create: 2023-02-20 13:46
**/
@Component
@Order(4)
public class HelmetRunner implements ApplicationRunner {
@Autowired
BvCspUtils bvCspUtils;
@Override
public void run(ApplicationArguments args) throws Exception {
WebSocketClient client = bvCspUtils.getClient();
if (client != null){
client.send("ok!!");
}
}
}