生效位置 DefaultListableBeanFactory
- 如果是FactoryBean,则....
- 如果不是FactoryBean,开始实例化阶段
一、实例化阶段
-
获取sharedInstance,非空直接返回该实例,为空继续实例化阶段
-
实例化后置处理器执行 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation ,目的是为了提供代理机会。
- 如果返回了代理类,则Bean后置处理器执行 BeanPostProcessor#postProcessAfterInstantiation ,并且直接返回该Bean。
-
获取Bean实例Instance。
- 如果单例池中存在该Bean实例,返回单例池中的Bean。如果单例池中不存在该Bean实例,则调用构造方法获得Bean实例Instance。并且将该Bean实例加入到单例池中
- 判断Bean实例如果不是FactoryBean,直接返回该实例。如果是FactoryBean,则返回其getObject方法创建的实例。
@Configuration 类会被加载为 factoryBean ,通过invoke其内部 @Bean 修饰方法来获得具体的Bean实例
-
Bean合并(加工)后置处理器接口执行 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition ,合并Bean定义之后调用, 大致为依赖注入的部分功能。其实现类如 CommonAnnotationBeanPostProcessor 、 AutowiredAnnotationBeanPostProcessor 和 ApplicationListenerDetector 等
被调用代码位于 AbstractAutowireCapableBeanFactory#1116
例如AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition 实现了将通过@Autowired注入的类加入到injectedElements和checkedElements中,checkedElements过滤掉了非容器管理的实体类,实际注入的成员类是checkedElements中的元素。
-
实例化后置处理器执行 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation 。该方法有具体代码的实现类如 AutowiredAnnotationBeanPostProcessor 等。
-
实例化后置处理器执行 InstantiationAwareBeanPostProcessor#postProcessProperties 和 #postProcessPropertyValues ,实现Bean内的注入依赖。该方法有具体代码的实现类如 CommonAnnotationBeanPostProcessor 和 AutowiredAnnotationBeanPostProcessor 等
二、初始化阶段(重要,内含AOP、注解等增强功能)
- 调用接口 Aware 的实现方法, BeanNameAware#setBeanName 、BeanClassLoaderAware#setBeanClassLoader , BeanFactoryAware#setBeanFactory 等
被调用代码位于 AbstractAutowireCapableBeanFactory#1791
- 初始化后置处理器执行 BeanPostProcessor#postProcessBeforeInitialization , 如果方法返回空,则停止所有后置处理器 postProcessBeforeInitialization 方法的执行,直接返回Bean。该方法有具体代码的实现类如 CommonAnnotationBeanPostProcessor 和 AutowiredAnnotationBeanPostProcessor 等
被调用代码位于 AbstractAutowireCapableBeanFactory#1796
- 如果Bean实现了InitializingBean,则先执行afterPropertiesSet方法,再执行自定义的initMethod
被调用代码位于 AbstractAutowireCapableBeanFactory#1800
- 初始化后置处理器执行 BeanPostProcessor#postProcessAfterInitialization 。
被调用代码位于 AbstractAutowireCapableBeanFactory#1808
- 经过一系列判断,注册 Bean 成为一次性的,具体方法是 registerDisposableBeanIfNecessary 。
被调用代码位于 AbstractAutowireCapableBeanFactory#661
三、完成阶段
- 单例Bean存储到单例池singletonObjects中
四、销毁阶段