spring依赖注入(属性赋值)

前提:在spring启动时,扫描得到某个业务bean,经过实例化等等步骤后,需要给这个bean进行属性赋值或者set方法的注入,也就是执行populateBean()方法。以下为核心流程

InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()

在属性赋值之前spring对外提供了一个实例化后的拓展,对bean进行加工

spring内部实现自动注入

在spring中不写任何注解,通过set方法来实现属性的依赖注入

1、通过spring.xml方式启动,在bean定义中设置autowire属性(值:byName或者byType),注意一定要写set方法

2、通过实现BeanFactoryPostProcessor修改某个BeanDefinition的autowireMode属性(测试不成功)

执行处理属性的逻辑AutowiredAnnotationBeanPostProcessor#postProcessProperties()

1、通过findAutowiringMetadata() 方法找到所有的被@Autowired、@Value、@Inject注解的属性和set方法(找到注入点);将找到的属性和set方法封装为AutowiredFieldElement对象,缓存到list,父类添加在前面,最后封装为InjectionMetadata对象

2、如果某个属性或set方法存在@Lazy注解,则通过ProxyFactory构造一个代理对象,在getBean是会调用代理对象的getTarget()方法去beanFactory中查找对应bean对象,最后执行相关操作

3、如果不存在@Lazy注解,则调用doResolveDependency(),先解析@Value,支持占位符${}和spring表达式#{}(代表注入beanName)

4、调用findAutowireCandidates()去单例池中找beanName对应bean,如果没有找到就去BeanDefinitionMap中查找,有可能找到多个

5、通过调用isAutowireCandidate()再判断BeanDefinition中autowireCandidate属性是否可以用来依赖注入;然后判断该type是不是泛型,如果是泛型则会把所有的bean找出来进行匹配,匹配到了;继续判断当前beanName是否存在@Qualifier注解,如果不存在,则通过筛选,否则会判断是否和当前DependencyDescriptor上的Qualifier相等,相等才会通过;如果找到一个直接返回,多个则继续判断,是否存在一个为@Primary注解的bean,有直接返回;不存在继续判断优先级@Priority注解优先级高的直接返回;否则通过beanName去匹配

6、最后通过反射赋值给某个属性或者set方法

注意:

spring实现泛型注入是通过Type类型的反射api获得对应的类型进行匹配的

而springcloud的负载均衡就是通过@Qualifier注解实现的,通过调用不同的注解就可以获得不同的拒载均衡器,底层就是匹配@Qualifier注解中属性值类区分的

CommonAnnotationBeanPostProcessor是处理@Resource,该注解与@Autowired的区别就是,它先通过名称查找bean,如果没有找到,则用字段类型或者set方法参数类型去查找,如果还是没有找到 则抛异常;@Autowired是先根据类型去bean工厂中查找bean,没有找到用bean的名称去查找。

个人笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值