AutowiredAnnotationBeanPostProcessor执行原理分析
之前介绍了Bean后处理器的使用,那@AutoWired注解是如何生效?
1.准备Bean
package com.example.demo2.b02;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:06*/
public class Bean1 {private static final Logger log = LoggerFactory.getLogger(Bean1.class);private Bean2 bean2;@Autowiredpublic void setBean2(Bean2 bean2){log.info("Autowired生效 :{}",bean2);this.bean2 = bean2;}private Bean3 bean3;@Resourcepublic void setBean3(Bean3 bean3){log.info("@Resource生效 :{}",bean3);this.bean3 = bean3;}private String home;@Autowiredpublic void setHome(@Value("${JAVA_HOME}") String home){this.home = home;log.info("@Value生效: {}",home);}@PostConstructpublic void init(){log.info("@PostConstruct 生效");}@PreDestroypublic void destroy(){log.info("@PreDestroy 生效");}@Overridepublic String toString() {return "Bean1{" +"bean2=" + bean2 +", bean3=" + bean3 +", home='" + home + '\'' +'}';}
}
package com.example.demo2.b02;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:08*/
public class Bean2 {
}
package com.example.demo2.b02;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:08*/
public class Bean3 {
}
2.执行过程分析
package com.example.demo2.b02;import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.core.env.StandardEnvironment;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/4 21:24*/
public class TestDigInAutowired {public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();beanFactory.registerSingleton("bean2",new Bean2());beanFactory.registerSingleton("bean3",new Bean3());beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());//解析@valuebeanFactory.addEmbeddedValueResolver(new StandardEnvironment()::resolvePlaceholders);//解析${}的解析器//1.查找哪些属性加了@AutowiredAutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor();processor.setBeanFactory(beanFactory);Bean1 bean1 = new Bean1();System.out.println(bean1);processor.postProcessProperties(null,bean1,"bean1"); //执行依赖注入 @Autowired @ValueSystem.out.println(bean1);}
}
1)创建BeanFactory
注入Bean1和Bean2,并且设置@Value注解解析器以及${}的解析器。
2)创建后处理器
AutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor();
3)postProcessProperties方法使用
processor.postProcessProperties(null,bean1,"bean1");
主要是通过上面方法查找加了@Autowired注解的属性并进行依赖注入。
结果:
继续看源码里面是如何实现的,先使用了下面方法查找@Autowired注解。
findAutowiringMetadata(beanName, bean.getClass(), pvs)
并使用下面方法进行了注入。
metadata.inject(bean, beanName, pvs);
4)findAutowiringMetadata方法
该方法主要用来查找加了@Autowired注解的属性并封装成元数据。
5)Inject方法注入