大家用过spring的肯定都用过AutoWired注解,但是你想过自动注入的原理吗,这次就来说下自动注入是怎么实现的。在之前的spring的ioc容器启动过程中,我们都知道ioc容器的启动是从AbstractApplicationContext的refresh方法开始的,在ioc容器启动时会初始化加载的BeanPostProcessor,那么BeanPostProcessor是什么呢?BeanPostProcessor就是在bean初始化时操作的后置处理器,那么这和自动注入有什么关系呢?这就要从我们要说的AutowiredAnnotationBeanPostProcessor说起了。先来看下AutowiredAnnotationBeanPostProcessor的类的结构

Spring源码分析之AutowiredAnnotationBeanPostProcessor

AutowiredAnnotationBeanPostProcessor实现了BeanPostProcessor接口,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注解时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。先来看下buildAutowiringMetadata方法

Spring源码分析之AutowiredAnnotationBeanPostProcessor

buildAutowiringMetadata方法解析等待自动注入类的所有属性,它通过分析所有字段和方法并初始化org.springframework.beans.factory.annotation.InjectionMetadata类的实例来实现,InjectionMetadata类包含要注入的元素的列表,注入是通过Java的 Reflection Field set方法或Method invoke方法完成的,此过程直接在AutowiredAnnotationBeanPostProcessor的方法中调用public void processInjection(Object bean) throws BeanCreationException。它将所有可注入的bean检索为InjectionMetadata实例,并调用它们的inject()方法。

Spring源码分析之AutowiredAnnotationBeanPostProcessor

InjectedElement的inject方法

Spring源码分析之AutowiredAnnotationBeanPostProcessor

AutowiredAnnotationBeanPostProcessor类中的另一个重要方法是findAutowiredAnnotation,它通过分析属于一个字段或一个方法的所有注解来查找@Autowired注解,如果未找到@Autowired注解,则返回null,字段或方法也就视为不可注入。 

Spring源码分析之AutowiredAnnotationBeanPostProcessor

至此,spring的自动注入就完成了。

相关文章: