近日,在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;
- }
- }