金三银四,很快又到了招聘旺季了,最近经常需要去做各种面试,发现很多几年工作经验的候选人,对Spring了解也是知之甚少,更多的只是会用,比如一个@Autowired原理都可以问倒一大片。
为此,趁着小仙女今天加班,长话短说的聊聊这个话题吧!
@Autowired注解是如何实现自动装配的
@Autowired注解之所以可以实现自动装配,主要是依赖Spring提供的处理器AutowiredAnnotationBeanPostProcessor,该处理器在初始化的时候便加入了对@Autowired、@Inject、@Value三个注解的处理;
该处理器实现了接口InstantiationAwareBeanPostProcessor,因此可以在bean对象实例化的时候,对其使用了@Autowired的成员进行自动装配。
源码参考如下:
public AutowiredAnnotationBeanPostProcessor() {
// 加入了对@Autowired、@Inject、@Value三个注解的处理
this.autowiredAnnotationTypes.add(Autowired.class);
this.autowiredAnnotationTypes.add(Value.class);
try {
this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
logger.info("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
}
catch (ClassNotFoundException ex) {
// JSR-330 API not available - simply skip.
}
}
该处理器何时被加入的
当构造Spring容器的时候,Spring会向容器注册几个内置的处理器对象,其中就包括了AutowiredAnnotationBeanPostProcessor。
源码可以直接看AnnotationConfigUtils.registerAnnotationConfigProcess