目录
- Autowired实现原理
- populateBean
- InstantiationAwareBeanPostProcessor
- AutowiredAnnotationBeanPostProcessor
- 后置处理器
- BeanFactory的后置处理器
- BeanDefinitionRegistryPostProcessor
- BeanFactoryPostProcesso
- ConfigurationClassPostProcessor
- Bean的后置处理器
- BeanProcessor
- InstantiationAwareBeanPostProcessor
- MergedBeanDefinitionPostProcessor
- SmartInstantiationAwareBeanPostProcessor
- Bean生命周期总结图
Autowired实现原理
populateBean
给创建好的bean实例进行普通属性的赋值
InstantiationAwareBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
这个就是用来完成Autowired注解能够自动装配的bean后置处理器
这个方法初始化了一个set,用来存放需要解析的自动装配注解,里面就包括Autowired,Value和Inject等,之后Spring拿到这些元数据信息直接反射赋值
private final Set<Class<? extends Annotation>> autowiredAnnotationTypes = new LinkedHashSet<>(4);
public AutowiredAnnotationBeanPostProcessor() {
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.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
}
catch (ClassNotFoundException ex) {
// JSR-330 API not available - simply skip.
}
}
后置处理器
BeanFactory的后置处理器
BeanDefinitionRegistryPostProcessor
在容器刷新12步骤中由invokeBeanFactoryPostProcessors
方法调用,是bean定义信息注册中心的增强,先去执行实现了PriorityOrdered接口,再去执行实现了Ordered接口的实例对象,最后去执行没有实现顺序接口的bean工厂增强器
BeanFactoryPostProcesso
bean工厂的增强器,执行步骤同BeanDefinitionRegistryPostProcessor
一样
ConfigurationClassPostProcessor
配置类的增强处理器,Spring底层通过他继承了BeanDefinitionRegistryPostProcessor
实现了bean信息注册中心的增强,把项目中所有的配置类信息解析出来放入信息注册中心,等待后续的Bean创建.使用doProcessConfigurationClass
方法解析诸如@Component
和@ComponentScan
等等注解
Bean的后置处理器
由容器刷新12步中的registerBeanPostProcessors
方法去专门的注册Bean的后置增强处理器
BeanProcessor
- postProcessBeforeInitialization:有机会在对Bean进行填充修改
- postProcessAfterInitialization:有机会在对Bean进行填充修改
InstantiationAwareBeanPostProcessor
- postProcessAfterInstantiation:bean初始化后进行处理,
@Autowired
自动装配的赋值可以再次操作,但是他直接返回true,没有做事 - postProcessProperties:真正进行自动装配(也可以自己解析自定义的注解进行属性值的注入)
MergedBeanDefinitionPostProcessor
postProcessMergedBeanDefinition:再次修改Bean的定义信息
SmartInstantiationAwareBeanPostProcessor
- predictBeanType:在注册监听器
registerListeners()
步骤触发,是在组件创建之前最后修改组件类型的机会,可以给组件指定任意的类型 - determineCandidateConstructors:告诉spring可以用哪些构造器
- getEarlyBeanReference:返回早期的Bean引用
对Bean进行代理增强期间进行使用