持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
如何进行静态属性的bean注入
前文
正常来说,一般情况我们进行bean注入都是非静态属性,有几种常用的注入方式,例如通过方法注入,通过属性直接注入,通过setter方法注入等等。而当我们需要进行静态属性的注入时,会发现直接采用@autowired会出现空指针错误,也就是无法直接通过注解注入。本文将主要探讨一下静态属性的bean注入问题。
错误代码
首先看一段错误的代码。代码中按照常见的注解注入方式进行属性的注入。而属性我们已经预先使用关键字修饰,使其成为静态属性。而注入的内容我们已经预先写好了方法a,只需要在方法中调用即可。但当我们按照这种方式进行代码调用时,代码中出现了如下异常:java.lang.NullPointerException at com.mountain.sea.controller.TestStaticController.testStatic(TestStaticController.java:20),也就说明这种方式的注入无效。
@RestController
public class TestStaticController {
@Autowired
public static TestController testController;
@GetMapping("/testStatic")
public Object testStatic(){
return testController.a();
}
}
正确注入方式
如下代码为实际的正确注入方式,我们需要通过注解进行方法参数的注入,而在方法中进行静态变量属性的设置。按照这种方式当我们注入后进行调用时,也就真正返回了方法a实际的返回时,成功的进行了静态属性注入及调用。实际的代码逻辑如下:
@RestController
public class TestStaticController {
@Autowired
public void initStatic(TestController testController){
TestStaticController.testController = testController;
}
@GetMapping("/testStatic")
public Object testStatic(){
return testController.a();
}
}
同样的与上述代码类似,注入时也可以采用构造方法的方式或者setter的方式进行注入,与上述的方法注入原理类似。
原因
至于出现该现象的原因,可以通过查看该注解的源码得到,该注解会自动忽略对于所有静态方法以及静态属性的处理,只用非静态的属性和方法才可以通过该注解进行注入。Autowired annotation is not supported on static fields: 。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚来。