一、前言
主要讲解了在依赖注入过程中, 注入点的获取和属性的注入。
二、前置学习
依赖注入的几种方式
@Bean注解注入(已废弃)
使用以下这种方式去注入, 源码分析会用到
自动注入
源码位置
实例化Bean方法: AbstractAutowireCapableBeanFactory.doCreateBean(), 在这个方法里面有一个属性填充的方法:
doCreateBean没印象或者不知道的, 建议从头开始看源代码, 从头走一遍, 才更清晰明了
点进去, 这个方法就是依赖注入相关源代码
三、@Bean注解注入分析
在我们的源码方法 populateBean里面, 有一段这样的代码
如果我们使用 @Bean(autowire = Autowire.BY_TYPE) 这种方式去注入的话, 那么就会进入上图中红框位置的 if判断
AUTOWIRE_BY_NAME
假设我们使用的是 @Bean(autowire = Autowire.BY_NAME)方式, 那么就会进入以下方法
unsatisfiedNonSimpleProperties方法
在上面的 autowireByName方法中, 又是通过了 unsatisfiedNonSimpleProperties(mbd, bw);方法去获取 Bean中能进行自动注入的属性名, 我们进入这个方法看一下
其中画红框的, 叫做属性描述器, 是由java.beans提供的, 在这里获取当前 Bean的类里面具体的属性和其getter, setter方法
当一个属性是 private作用域且有对应的 getter和 setter方法, 那么 java就认为他是一个真正的属性
接下来的流程判断什么样的属性能进行自动注入?:
- 该属性有对应的set方法
- 没有在ignoredDependencyTypes中
- 如果该属性对应的set方法是实现的某个接口中所定义的,那么接口没有在ignoredDependencyInterfaces中
- 属性类型不是简单类型,比如int、Integer、int[]