先跟一段debug再看总结:
1 创建实例
- InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(自定义一个对象或者代理对象)
- createBeanInstance(创建实例)
- MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(发现属性:@Value和@Autowired注解)
2 填充属性
- InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(实例化后置处理器,最后一次机会修改beanDefinitinon)
- InstantiationAwareBeanPostProcessor.postProcessProperties(填充属性1:@Value和@Autowired注解)
- applyPropertyValues(属性填充2:beanDefinition里的propertyValues有值时)
3 初始化
- invokeAwareMethods:回调aware接口,注入spirng核心组件或上下文对象
- BeanPostProcessor.postProcessBeforeInitialization: @PostConstruct方法调用
- invokeInitMethods: 初始化
- BeanPostProcessor.postProcessAfterInitialization: 代理对象创建(AOP核心)
① 3-5:是一对,一个探测,一个填充;
AutowiredAnnotationBeanPostProcessor 针对的是@Value和@Autowired属性的探测和填充;
CommonAnnotationBeanPostProcessor 针对的是@Resource和@PostConstruct属性的探测和填充
探测都是同一个方法,但是,@Resource属性的填充是CommonAnnotationBeanPostProcessor.postProcessProperties② @PostConstruct方法的调用是:CommonAnnotationBeanPostProcessor.postProcessBeforeInitialization)
③ 9:bean实现InitializingBean接口,回调afterPropertiesSet方法。
④ 10:AnnotationAwareAspectJAutoProxyCreator 创建代理对象。