问题背景
在项目中因为一些工具类是静态方法,所以必须需要使用静态变量才能使用,然而此时如果使用@Autowired是无法将需要的值直接注入到静态变量中的,也就会出现你虽然写了@Autowired但是这个变量还是为空。
解决方式
1、添加一个非静态的set方法,然后注解写在set方法上即可
2、添加一个构造方法,然后注解写在构造方法上
原理
首先先看一下spring是如何找到标识@Autowired的变量来进行注入的,我们知道spring的实例创建和处理都是通过BeanPostProcessor后置处理器来执行的,因此我们找到了它然后来看下它的执行
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata源码分析
private InjectionMetadata buildAutowiringMetadata(final Class> clazz) {
// 存放当前类包括父类中带@Autowired注解的字段和方法
List elements = new ArrayList<>();
Class> targetClass = clazz;
do {
// 存放targetClass中所有带了@Autowired注解的字段和方法
final List currElements = new ArrayList<>();
ReflectionUtils.doWithLocalFields(targetClass, field -> {