静态方法里调用注入的mapper显示为null

文章讲述了在Java项目中,由于静态变量在类加载时初始化,而此时Mapper可能未实例化,导致出现null异常。通过使用@Order注解调整Bean加载顺序,并实现ApplicationRunner接口,在项目启动后执行特定代码来初始化静态变量,从而解决这个问题。
摘要由CSDN通过智能技术生成

前言

需求,项目中有一些阈值,比如心率达到100,就报警。
数据过来之后要实时拿这些阈值去判断是否需要报警。
实现:
在项目启动的时候获取一下阈值表里的数据,做成单例。
同时如果阈值表里的数据更新,要提供一个刷新的接口刷新一下数据。
问题:
我在类里声明了类的静态变量,构造方法里调用了mybatis的Mapper层接口获取数据。
项目启动的时候报null
在这里插入图片描述


静态方法里调用注入的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!!");
        }

    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑白极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值