PostProcessor?
PostProcessor (增强器 后置处理器) ,BeanFactoryPostProcessor 完成对 Beanfactory 相关信息的修改或者扩展,BeanPostProcessor 完成对 bean 的修改或者扩展。
Bean的生命周期
取自BeanFactory接口代码注释
* <p>Bean factory implementations should support the standard bean lifecycle interfaces
* as far as possible. The full set of initialization methods and their standard order is:
* Bean工厂实现应该尽可能地支持标准bean lifecycle接口,所有实例方法和他们的标准排序如下
* <ol>
* <li>BeanNameAware's {@code setBeanName}
* <li>BeanClassLoaderAware's {@code setBeanClassLoader}
* <li>BeanFactoryAware's {@code setBeanFactory}
* <li>EnvironmentAware's {@code setEnvironment}
* <li>EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
* <li>ResourceLoaderAware's {@code setResourceLoader}
* (only applicable when running in an application context)
* <li>ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
* (only applicable when running in an application context)
* <li>MessageSourceAware's {@code setMessageSource}
* (only applicable when running in an application context)
* <li>ApplicationContextAware's {@code setApplicationContext}
* (only applicable when running in an application context)
* <li>ServletContextAware's {@code setServletContext}
* (only applicable when running in a web application context)
* <li>{@code postProcessBeforeInitialization} methods of BeanPostProcessors
* <li>InitializingBean's {@code afterPropertiesSet}
* <li>a custom init-method definition
* <li>{@code postProcessAfterInitialization} methods of BeanPostProcessors
* </ol>
脉络总览
分步骤讲解
关键方法 ApplicationContext.refresh();
refresh 方法
@Override
public void refresh() throws BeansException, IllegalStateException {
//startupShutdownMonitor对象在spring环境刷新和销毁的时候都会用到,确保刷新和销毁不会同时执行
synchronized (this.startupShutdownMonitor) {
// 准备工作,例如记录事件,设置标志,检查环境变量等,并有留给子类扩展的位置,用来将属性加入到applicationContext中
prepareRefresh();
// 创建beanFactory,这个对象作为applicationContext的成员变量,可以被applicationContext拿来用,
// 并且解析资源(例如xml文件),取得bean的定义,放在beanFactory中
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对beanFactory做一些设置,例如类加载器、spel解析器、指定bean的某些类型的成员变量对应某些对象等
prepareBeanFactory(beanFactory);
try {
// 子类扩展用,可以设置bean的后置处理器(bean在实例化之后这些后置处理器会执行)
postProcessBeanFactory(beanFactory);
// 执行beanFactory后置处理器(有别于bean后置处理器处理bean实例,beanFactory后置处理器处理bean定义)
invokeBeanFactoryPostProcessors(beanFactory);
// 将所有的bean的后置处理器排好序,但不会马上用,bean实例化之后会用到
registerBeanPostProcessors(beanFactory);
// 初始化国际化服务
initMessageSource();
// 创建事件广播器
initApplicationEventMulticaster();
// 空方法,留给子类自己实现的,在实例化bean之前做一些ApplicationContext相关的操作
onRefresh();
// 注册一部分特殊的事件监听器,剩下的只是准备好名字,留待bean实例化完成后再注册
registerListeners();
// 单例模式的bean的实例化、成员变量注入、初始化等工作都在此完成
finishBeanFactoryInitialization(beanFactory);
// applicationContext刷新完成后的处理,例如生命周期监听器的回调,广播通知等
finishRefresh();
}
catch (BeansException ex) {
logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);
// 刷新失败后的处理,主要是将一些保存环境信息的集合做清理
destroyBeans();
// applicationContext是否已经激活的标志,设置为false
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}
1、创建 BeanFactory 容器
2、加载配置文件,解析 Bean 定义信息,包装成 BeanDafination
BeanDifinationConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
--> refreshBeanFactory();
--> try{
// 创建 DefaultListableBeanFactory 对象
DefaultListableBeanFactory beanFactory = createBeanFactory();
// 为了序列化指定 id,可以从id反序列化到 BeanFactory 对象
beanFactory.setSerializationId(getId());
// 定制 beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
customizeBeanFactory(beanFactory);
// 初始化 documentReader,并进行 XML 文件读取及解析,默认命名空间的解析,自定义标签的解析
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
在 obtainFreshBeanFactory() 方法中,先创建了一个 DefaultListableBeanFactory,再向其中设置一些基本属性,后通过 loadBeanDifinations(beanFactory) 将自定义的对象加入到 beanDifinationMap 中,在 map 中完成将每一个对象包装成 BeanDifination;
3、执行 BeanFactoryPostProcesser
invokeBeanFactoryPostProcessors(beanFactory);
执行后,BeanDifination 已经确定。
4、准备工作:准备 BeanPostProcesser,广播器,监听器
initApplicationEventMulticaster();
registerListeners();
初始化当前应用的事件广播器
注册监听器
5、实例化操作
6、初始化操作
finishBeanFactoryInitialization(beanFactory);
--> beanFactory.preInstantiateSingletons();
--> // 将所有的 beanDefinitionNames 创建一个集合
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// 触发所有非延迟加载单例 bean 的初始化,遍历集合的对象
for () {
...
getBean(beanName);
--> doGetBean(name, null, null, false);
--> // bean 对象实现 FactoryBean 接口后会变成 &beanName
String beanName = transformedBeanName(name);
Object bean;
// 提前检查单例缓存中是否有手动注册的单例对象,跟循环依赖有关联
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
...
} else {
createBean(beanName, mbd, args);
--> Object beanInstance = doCreateBean(beanName, mbdToUsc, args);
--> instanceWrapper = createBeanInstance(beanName, mbd, args);
--> Constructor<?> ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
// 使用默认无参构造函数创建对象,如果没有无参构造且存在多个有参构造且没有 @AutoWired 注解构造,会报错
return instantiateBean(beanName, mbd);
--> beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
--> constructorToUse = clazz.getDeclaredConstructor();
return BeanUtils.instantiateClass(constructorToUse);
--> return ctor.newInstance(argsWithDefaultValues);
// 初始化过程 填充属性
populateBean(beanName, mbd, instanceWrapper);
// 执行初始化逻辑
exposedObject = initializeBean(beanName, exposedObject, mbd);
--> // Aware 接口处理器,调用 BeanNameAware、BeanClassLoaderAware、beanFactoryAware
invokeAwareMethods(beanName, bean);
// 将 BeanPostProcessors 应用到给定的现有 Bean 实例,调用它们的postProcessBeforeInitialization 初始化方法。
wrappedBean = applyBeanPostProcessorBeforeInitialization(wrappedBean, beanName);
// 调用初始化方法,先调用 bean 的 InitializingBean 接口方法,后调用 bean 的自定义初始化方法
invokeInitMethods(beanName, wrappedBean, mbd);
// 将 BeanPostProcessors 应用到给定的现有 Bean 实例,调用它们的 postProcessAfterInitialization方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
}
实例化所有 剩余的 非懒加载的 单例对象
Aware接口是方便自定义对象获取到容器对象
7、获取对象
略