加载过程
- load BeanDefinition
- merge BeanDefinition(GenericBeanDefinition -》RootBeanDefinition)
- 不存在parent,直接创建RootBeanDefinition
- 存在parent,复制新的RootBeanDefinition,并且覆盖parent相关配置
- postProcessBeanFactory(覆盖org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory)
- 调用上下文本身的beanFactory后置处理方法
- invokeBeanFactoryPostProcessors(实现BeanFactoryPostProcessor扩展)
- 调用beanFactoryPostProcessors。
- 例如:在配置文件中使用占位符的方式来配置bean属性,解析由PropertyPlaceholderConfigurer实现。
- BeanDefinitionRegistryPostProcessor接口继承自BeanFactoryPostProcessor接口。
- 例如:mybatis的mapper接口无需写实现类,就是由MapperScannerConfigurer实现BeanDefinitionRegistryPostProcessor,扫描@Mapper注解修饰的接口,注册factoryBean为MapperFactoryBean的AnnotatedBeanDefinition,最终会创建MapperProxy对象。
- registerBeanPostProcessors(实现BeanPostProcessor扩展)
- 注册bean的后置处理器
- 国际化
- 初始化事件多播器
- 注册监听器
- 创建bean
- 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
- 实例化bean
- 将匿名BeanFactory添加至三级缓存
- 属性填充
- 循环依赖时,执行依赖对象在三级缓存中的BeanFactory,得到代理对象,但是被代理对象还未完成属性填充和初始化,将代理对象放入二级缓存
- 执行org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
- 初始化bean
- 执行beanPostProcessor的beforeInitialization
- InitDestroyAnnotationBeanPostProcessor处理@PostConstruct
- 执行initializingBean#afterPropertiesSet()
- 例如:AOP事务管理用到的类,TransactionProxyFactoryBean 就是利用afterPropertiesSet方法事先把事务管理器 TransactionManager的代理类对象给生成好了,后面调用FactoryBean对象的getObject方法的时候,就直接把这个代理对象返回出去了。
- 执行init-method
- 执行beanPostProcessor的afterInitialization
- AnnotationAwareAspectJAutoProxyCreator继承AbstractAutoProxyCreator,处理Aspect注解,生成代理对象
- 此时被代理对象完成了初始化,是个完整对象,于是将代理对象放入一级缓存。
循环依赖