在项目中使用redis遇到了注入为空的问题,排查问题发现是因为同时使用了static和Autowired问题。
问题原因:原项目中使用的是Hazelcast,现需要将其替换为refsa
//项目原码
@Component
public class CacheUtil {
private static final HazelcastUtil cache = new HazelcastUtil<>();
}
//替换redis后报错代码
@Component
public class CacheUtil {
//空指针,注入不进去
@Autowired
private static RedisUtil cache;
}
错误原因:
和加载顺序有关系,static在类初始化的时候就加载,且只加载一次。早于自动注入,所以会报空指针。且spring本身也不支持这种写法。但依然有解决的办法,目的是让自动注入执行顺序先于static。
方法一:使用@PostConstruct注解,在里面为static静态成员赋值
@Component
public class CacheUtil {
@Autowired
private RedisUtil redisUtil;
@Autowired
private static RedisUtil cache;
@PostConstruct
public void init() {
cache = redisUtil;
}
}
方法二:将@Autowire加到构造方法上
@Component
public class CacheUtil {
@Autowired
private RedisUtil redisUtil;
@Autowired
private static RedisUtil cache;
public CacheUtil(){
cache=redisUtil;
}
}
以上两种方式核心思想都是延迟为static成员属性赋值。