准备
注意: spring中,Bean分为两种,一种Bean,一种FactoryBean。本质上没什么区别都是往IOC容器中注册Bean。但是形式上有区别,前者往IOC容器中注册了一个对象,后者为两个且后者FactoryBean主要用户创建复杂对象,例如SqlSessionFactoryBean,创建之前需要进行大量的XML解析
而Bean由于创建的流程,又分为SpringBean和普通Bean。IOC容器一级缓存池中存放的是SpringBean,只是简单通过反射创建的称之为普通Bean
refresh方法
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 刷新前预处理
prepareRefresh();
// 获取之前创建的BeanFactory,默认实现DefaultListableBeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// BeanFactory的预准备⼯作(BeanFactory进⾏⼀些设置,设置类加载器,环境等等。
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// 实例化并调用默认配置,和自定义的BeanFactoryPostProcessor,实现核心配置类解析,包组件扫描封装BeanDefinition.
invokeBeanFactoryPostProcessors(beanFactory);
// 注册默认配置的和自定义的BeanPostProcessor , 实现bean创建赋值之后 init 方法前后调用
registerBeanPostProcessors(beanFactory);
// 初始化MessageSource组件,实现 国际化功能,消息绑定,消息解析
initMessageSource();
// 初始化应用事件派发器
initApplicationEventMulticaster();
// 子类重写
onRefresh();
// 注册实现了ApplicationListener接⼝的监听器
registerListeners();
// 实例化剩下的所有单例bean
finishBeanFactoryInitialization(beanFactory);
// 发布事件,交由其它组件触发对应响应,例如springMVC初始化
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
Bean创建流程
1、通过invokeBeanFactoryPostProcessors,我们知道其通过创建ConfigurationClassPostProcessor从容器中BeanDefininitonMap中获取满足条件的配置类,默认为核心配置类,进行解析,例如@ComponentScan指定包下组件扫描,@Bean都封装成BeanDefiniton,放入BeanDefininitonMap。此时我们配置的组件都会被扫描到其中
2、注册实例化BeanPostProcessor,实现Bean init 前后调用
3、实例化BeanDefinitionMap当中的剩余的所有单例
4、实例化所有非懒加载的单例Bean,对FactoryBean,Bean分别实例化
4.1、实例化普通单例Bean
4.1.1、先判断一级缓存中有木有对应的单例对象,如果没有那么创建
4.1.2、 最终通过目标Bean的class,调用声明的构造方法,实现Bean的创建,此时Bean只是一个空对象。
4.1.3、 主动缓存当前的单例Bean到三级缓存singletonfactorys中,以便能够解决循环依赖
4.2、将当前创建的Bean,进行属性赋值(populateBean)
判断是否需要依赖注入,如果需要(例如当前创建的Bean A 需要依赖 Bean B), 那么会先去创建依赖Bean B,内部实现由AutowireAnnotationBeanPostProcessor解决
4.3、Bean被创建完成后,进行初始化Bean
4.3.1、 判单当前Bean是否实现了Aware接口,如果实现了,那么调用对应方法
例如:实现了BeanFactoryAware,那么为当前Bean,设置BeanFactory
4.3.2、在Bean init 方法前后调用,调用BeanPostProcessor
到此为止,SpringBean以正式创建完成
SpringBean创建完成之后,会被放入到Spring一级缓存池中
5、实例化FactoryBean
5.1、实例化FactoryBean,唯一ID为,&FactoryName。
其它流程也是跟Bean创建流程一样,但是获取FactoryBean,需要通过&FactoryName。
获取FactoryBean生产的Bean,是在调用的时候,进行懒创建(也即需要则创建),单例默认会放入缓存池中
总结
Bean创建流程
1、通过InvokeBeanFactoryPostProcessor,创建ConfigurationClassPostProcessor,实现@Configuration配置类解析,包组件扫描封装自定义的组成,成BeanDefinition,放入BeanDefinitionMap中
2、注册BeanPostProcessor,无论是系统的,还是自定义的到IOC容器中,作用在于Bean init 前后调用
3、实例化剩下的所有单例Bean
3.1、普通Bean实例化
- 通过反射调用当前Bean的构造方法,创建Bean实例对象
- 将当前Bean放入到Spring三级缓存singletonFactorys中,以便解决循环依赖问题
- Bean创建完之后,进行属性赋值,如果当前Bean A,依赖于 Bean B,那么优先创建Bean B, 流程一致,通过AutowireAnnotationBeanPostProcessor
- 属性赋值完后,判断当前Bean 是否实现了 XXXAware接口,并调用对应Set方法
- 接着,调用Bean init 方法, 当然,在调用之前,遍历BeanPostProcessor,进行Before,After调用
- 到此为止,SpringBean正式创建完成,将其放入IOC一级缓存中
3.2、FactoryBean实例化
- 直接创建FactoryBean,名字为:&FactoryBeanName,创建流程一样
- 当需要FactoryBean生产的Bean时,那么进行懒创建,同理