近日,在Springboot中用到了@Autowired注解的变量。后来,发现该变量需要属于此类,故把此变量定义为了static变量。
然后,发现问题为:该代码在编译的时候,是正常的;但在运行的时候,@Autowired注解的静态变量为null。
分析原因为:当类加载器加载静态变量是,Spring上下文尚未加载;所以,类加载器不会在Bean中正确注入静态类。
当然,这不代表注解是不可用的。解决思路为:在加载静态内容时加载相关注解。
可用方法如下:
1.构造函数中加载注解:
public class Test {
private static A a;
@Autowired
public Test(A a){
Test.a = a;
}
}
2.给静态组件加Setter方法。
public class Test{
private static A a;
@Autowired
public void setA(A a){
Test.a = a;
}
}
3.使用动态变量进行注解,随后传给静态变量。
public class Test{
private static A a;
@Autowired
private A aAuto;
@PostConstruct
private void beforeInit() {
a = this.aAuto;
}
}
Note: @PostConstruct注解是在头早函数后调用。
4.Spring框架获取Bean。
public class A{
public static test(){
A a = SpringApplicationContextUtil.getBean("A");
}
}
在后来,我发现,还需要其他静态注解变量。
直接调用构造函数如下。
public class Test{
static A a;
static B b;
@Autowired
public Test(A a, @Value("${B}") B b) {
Test.a = a;
Test.b = b;
}
}