关于工具类静态方法调用@Autowired注入的service类问题
记录下。之前遇到过解决了 。但是没有深究。
spring自动注入,使用spring框架的很常用,但是如果在静态方法中调用此注入类的方法,发现注入为’null’;原因不是spring未注入,而是被static方法给’清空’了,在无法先于static方法初始化之前想了一个办法
private static Test test;
@Autowired
private Redisson redisson;
private String a = “a”;
private String b = “b”;
private String c = “c”;
private String d = “d”;
@PostConstruct
public void init() {
test= this;
test.redisson=this.redisson;
}
@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
构造器 加载属性时 需要加
public Test(String a){
RLock lock = redisson.getLock("key");
lock.lock();
System.out.println("b_____"+b);
System.out.println("c_____"+c);
System.out.println("d_____"+d);
lock.unlock();
}
此处会报错 空指针。 调用不了 redisson
需改为
public Test(String a){
redisson =test.redisson;
RLock lock = redisson.getLock(“key”);
lock.lock();
System.out.println(“b_____”+b);
System.out.println(“c_____”+c);
System.out.println(“d_____”+d);
lock.unlock();
}
此处redisson是作为test的属性。所以下面可以调用
需要在工具类中注入Service,由于工具类中方法一般都是静态的,所以要求该属性也要是静态的。
但是由于Spring/SpringBoot正常情况下不能支持注入静态属性(会报空指针异常)。
主要原因在于:Spring的依赖注入实际上是依赖于Set方法进行注入值的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。