解决springboot无法自动注入时,使用SpringUtil工具类时报空指针异常,或者redis注入报空

1.解决springboot无法自动注入时,使用SpringUtil工具类时报空指针异常,或者redis注入报空

问题描述:在做项目时候,有一个初始类实现了ApplicationListener跟Runnable接口,如果在类上加上@component会使得run方法一次会执行两遍,但是如果不交给spring容器管理,就无法依赖注入,这时候就得使用工具类SpringUtil来帮我们注入,但是注入的时候老是发生getbean报空指针,改工具类在其他类可以正常使用,唯独在这个初始类会报空指针,找了半天百度没找到方法,最后在项目里面找到了对应的解决办法
在这里插入图片描述

解决办法如下:

1.首先奉上SpringUtil工具类:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@Component
@Lazy(false)
public class SpringUtil implements ApplicationContextAware  {
	private static ApplicationContext applicationContext = null;
	public static ApplicationContext getApplicationContext(){return applicationContext;}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		if(SpringUtil.applicationContext == null){
			SpringUtil.applicationContext = applicationContext;
		}
	}
	
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }
 
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }
    
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

2.比如我要在一个类上注入redis的StringRedisTemplate,那我可以先在改类上声明一下

private StringRedisTemplate stringRedisTemplate;

如果是一般的类可以在声明时直接赋值如果是实现了ApplicationListener的类则要用第3点方法

private StringRedisTemplate stringRedisTemplate = SpringUtil.getApplicationContext().getBean(StringRedisTemplate.class);

3.在重写的onApplicationEvent方法里面使用SpringUtil工具

stringRedisTemplate = SpringUtil.getApplicationContext().getBean(StringRedisTemplate.class);

4.大功告成,就是这么简单

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值