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.大功告成,就是这么简单