Spring @Autowire 源码分析

1、 @Autowire 定义

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
	boolean required() default true;
}

@Autowire 注解是由 AutowiredAnnotationBeanPostProcessor 处理器来实现的。然后我们发现 AutowiredAnnotationBeanPostProcessor 实现了 MergedBeanDefinitionPostProcessor 接口中的 postProcessMergedBeanDefinition()方法。@Autowired注解正是通过这个方法实现注入类型的预解析,将需要依赖注入的属性信息封装到InjectionMetadata类中。,InjectionMetadata类中包含了需要注入的元素(injectedElements)及元素要注入的目标类(tagetClass)。
在这里插入图片描述
在这里插入图片描述

现在我们知道了AutowiredAnnotationBeanPostProcessor时Autowire的主力,那其又是如何完成依赖注入的呢?其实在Spring容器启动的时候其会调用AbstractApplicationContext类的refresh方法,其主要靠registerBeanPostProcessors()方法完成对AutowiredAnnotationBeanPostProcessor的注册,然后在finishBeanFactoryInitialization(beanFactory)方法对非延迟初始化的单例bean进行初始化时,会执行到AbstractAutowireCapableBeanFactory类的doCreateBean方法。
在这里插入图片描述
在doCreateBean()方法中其会调用applyMergedBeanDefinitionPostProcessors这时就会对AutowiredAnnotationBeanPostProcessor类中这个方法完成注入元素注解的预解析
在这里插入图片描述
然后其最终会调用doCreateBean方法中,其中会执行populateBean方法实现对属性的注入。
在这里插入图片描述
populateBean()方法,会遍历InstantiationAwareBeanPostProcessor,执行实例类的postProcessPropertyValues方法。
在这里插入图片描述
然后最终使用反射赋值。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值