我们都知道BeanFactory 仅提供bean的配置信息加载和创建工作,ApplicationContext 可以理解为是BeanFactory的扩展,ApplicationContext包含了BeanFactory的所有功能,并且对BeanFactory提供了一些企业级的扩展。
AbstractApplicationContext.refresh()方法,是整个ApplicationContext的入口方法,就从这个方法开始探究ApplicationContext容器是怎么刷新的。
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
/**
* 初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证。
* 在某种情况下项目的使用需要读取某些系统变量, 而这个变量的设置很可能会影响着系统的正确性
* 那么ClassPathXmlApplicationContext为我们提供的这个准备函数就显得非常必要
* 它可以在Spring启动的时候提前对必需的变量进行存在性验证。
*/
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 初始化BeanFactory,并进行XML文件读取。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
// 对BeanFactory进行各种功能填充。
// @Qualifier与@Autowired这两个注解正是在这一步骤中增加的支持。
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
/**
* 子类覆盖方法做额外的处理。
* 空的函数实现postProcessBeanFactory来方便程序员在业务上做进一步扩展。
*/
postProcessBeanFactory(beanFactory);
// 激活各种BeanFactoryPostProcessor后置处理器。(典型的有MyBatis的MapperScannerConfigurer)
invokeBeanFactoryPostProcessors(beanFactory);
// 注册BeanPostProcessor,这里只是注册,真正的调用是在getBean时候
// 注册的定义就是将BeanPostProcessor实例交给BeanFactory管理,放在BeanFactory对象的map属性中
registerBeanPostProcessors(beanFactory);
// 为上下文初始化Message资源,即对不同语言的消息体进行国际化处理
initMessageSource();
// 初始化事件广播器,广播器的作用是用来存放监听器并在合适的时候调用监听器
initApplicationEventMulticaster();
// 空方法,留给子类实现
onRefresh();
// 在所有注册的bean中查找listener bean,注册到消息广播器中。
registerListeners();
// 初始化剩下的单实例(非惰性的)
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
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();
}
}
}
1. 初始化前准备工作
在容器刷新前的一些初始化准备工作,例如:对系统属性和环境变量的校验工作。
protected void prepareRefresh() {
// Switch to active.
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
if (logger.isInfoEnabled()) {
logger.info("Refreshing " + this);
}
// 一个空方法,留给子类实现
initPropertySources();
// 验证需要的属性是否已经放入环境中
getEnvironment().validateRequiredProperties();
// Store pre-refresh ApplicationListeners...
if (this.earlyApplicationListeners == null) {
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
}
else {
// Reset local application listeners to pre-refresh state.
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}
// Allow for the collection of early ApplicationEvents,
// to be published once the multicaster is available...
this.earlyApplicationEvents = new LinkedHashSet<>();
}
2. 加载BeanFatory
我们知道ApplicationContext容器是具有BeanFactory的功能的,就是在这里实现创建的BeanFactory,创建完后ApplicationContext就真正的具有BeanFactory的功能了。
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 由子类实现这个方法
// 初始化BeanFactory,并读取XML文件,将BeanFactory对象属性放到当前容器中
// 这里要注意,如果是SpringBoot,子类实现这个方法时,不会加载XML文件,因为加载工作已经在这之前已经被执行
refreshBeanFactory();
// 返回ApplicationContext中的beanFactory对象
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
SpringBoot 的ApplicationContext容器实现refreshBeanFactory()方法的片段,是没有去创建beanFactory和加载配置的。这里我们有个了解就行,不做详述。我们的重点是分析非SpringBoot的ApplicationContext 实现refreshBeanFactory()方法
protected final void refreshBeanFactory() throws IllegalStateException {
if (!this.refreshed.compareAndSet(false, true)) {
throw new IllegalStateException(
"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
}
this.beanFactory.setSerializationId(getId());
}
2.1. 创建BeanFactory
在这里会创建DefaultListableBeanFactory对象,它是BeanFactory的实现。读取XML文件进行解析,对BeanFactory的相关属性赋值
protected final void refreshBeanFactory() throws BeansException {
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
// 创建BeanFactory对象
DefaultListableBeanFactory beanFactory = createBeanFactory();
// 设置序列号
beanFactory.setSerializationId(getId());
// 定制BeanFactory对象属性
// 其实就是设置allowBeanDefinitionOverriding和allowCircularReferences 属性
// allowBeanDefinitionOverriding 允许覆盖已经同名bean的实例标识
// allowCircularReferences 允许解决循环依赖标识
customizeBeanFactory(beanFactory);
// 从XML加载bean的配置
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
2.1.1. 定制BeanFactory属性
这里只是设置了BeanFactory 工厂对象是否允许覆盖同名的bean和循环依赖
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
// 允许覆盖同名的bean
// false 不允许,true 允许
if (this.allowBeanDefinitionOverriding != null) {
beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
// 允许解决循环依赖
// false 不允许,true 允许
if (this.allowCircularReferences != null) {
beanFactory.setAllowCircularReferences(this.allowCircularReferences);
}
}
2.1.2. 加载BeanDefinition
通过创建XmlBeanDefinitionReader对象,调用它的loadBeanDefinitions 信息,将bean配置信息转换为BeanDefinition对象,因为XmlBeanDefinitionReader 对象中具有BeanFactory,所以最终会把bean的beanDefinition交给BeanFactory
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// 为BeanFactory工程对象创建XmlBeanDefinitionReader对象
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
initBeanDefinitionReader(beanDefinitionReader);
// 加载bean配置信息
loadBeanDefinitions(beanDefinitionReader);
}
3. 准备BeanFactory
前面我们已经创建了BeanFactory对象,并且赋值给了ApplicationContext容器中的beanFactory属性。说明容器已经具备了BeanFactory对象,接下来需要对容器中的BeanFactory对象做一些准备工作
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 设置BeanFactory的classLoader为当前ApplicationContext的classLoader
beanFactory.setBeanClassLoader(getClassLoader());
// 为beanFactory中添加表达式语言处理器
// 处理如:#{bean.xxx}的表达式
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
// 为beanFactory中添加propertyEditor
// 这是一个对bean的属性管理的一个工具类
// 还可以实现PropertyEditorRegistry 接口,自定义属性管理器然后注册到beanFactory中,具体这里不做详述
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// 为beanFactory添加一个ApplicationContextAwareProcessor后置处理器
// 这个后置处理器的作用是在执行bean的初始化方法之前,检查bean是否为Aware类型,如果是先执行Aware对应的方法
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
// 设置几个需要忽略自动装配的接口,这些接口不会被自动装配
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
// 设置几个自动装配的特殊处理规则
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// 为beanFactory中添加一个ApplicationListenerDetector后置处理器
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// 设置对AspectJ的支持
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// 注册几个默认的bean
// 这些bean作为单实例bean放入IOC容器中
// 直接通过getBean(name)的方式就可以获取这些bean
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
4. 处理BeanFactory
这是一个空方法,留给子类实现的。在准备完BeanFactory工厂后,所有bean已经加载但还没实例化前,修改一些BeanDefinition。
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
}
5. 注册、激活BeanFactoryPostProcessor
BeanFactoryPostProcessor和BeanPostProcessor 基本类似,只是执行时机不同。BeanFactoryPostProcessor执行时机是在实例化bean前执行(典型有MyBatis的整合,通过MapperScannerConfigurer类来扫描MyBatis的接口和配置)。而BeanPostProcessor执行时机是在创建bean的实例阶段,在Bean的实例创建前后和bean的初始化方法前后做一些扩展。我们知道Spring之所以强大为程序员所追捧,是因为他的扩展性开放性。而PostProcessor就是实现扩展性和开放性的最好体现,程序员只需要实现接口来扩展自己的业务。
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
BeanFactoryPostProcessor的注册和激活最终交给PostProcessorRegistrationDelegate来处理。BeanFactoryPostProcessor 后置处理器分为普通的BeanFactoryPostProcessor 后置处理器和BeanDefinitionRegistryPostProcessor 类型的后置处理器。这两个后置处理器的区别在于BeanDefinitionRegistryPostProcessor 多了一个postProcessBeanDefinitionRegistry()后置处理器方法。所以我们在执行后置处理器时,先执行BeanDefinitionRegistryPostProcessor类型postProcessBeanDefinitionRegistry()后置处理器方法,再执行postProcessBeanFactory()共有的后置处理器方法
注册、激活方法的逻辑:
- 先执行类型是BeanDefinitionRegistryPostProcessor 类型,且是硬编码的的后置处理器postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的自postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行没有实现PriorityOrdered接口和Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行类型是BeanDefinitionRegistryPostProcessor 类型后置处理器的postProcessBeanFactory()后置处理器方法
执行类型是BeanFactoryPostProcessor类型的后置处理器,按照实现了PriorityOrdered和Ordered 接口的顺序先后执行postProcessBeanFactory() 后置处理器方法,最后再执行没有实现排序接口postProcessBeanFactory() 后置处理器方法。并排除BeanDefinitionRegistryPostProcessor类型,因为这个类型在之前已经执行过。
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// 记录被invoke激活过postProcessBeanDefinitionRegistry()方法的BeanFactoryPostProcessor 后置处理器bean名称
Set<String> processedBeans = new HashSet<>();
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// 常规的BeanFactoryPostProcessor 后置处理器
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
// 记录BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 处理硬编码注册的后置处理器
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
// 处理BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器,这类后置处理器比普通后置处理器多了一个postProcessBeanDefinitionRegistry()后置处理器方法
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
// 执行BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器的特殊方法,既:postProcessBeanDefinitionRegistry()
registryProcessor.postProcessBeanDefinitionRegistry(registry);
// 记录BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器
registryProcessors.add(registryProcessor);
}
else {
// 记录硬编码注册的常规后置处理器
regularPostProcessors.add(postProcessor);
}
}
// 通过配置注册的BeanDefinitionRegistryPosProcessor
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
// 获取配置注册的BeanDefinitionRegistryPostProcessor后置处理器
// 处理实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// 实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// 对实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法
registryProcessors.addAll(currentRegistryProcessors);
// 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
// 获取配置注册的BeanDefinitionRegistryPostProcessor后置处理器
// 处理实现了Ordered 接口的BeanDefinitionRegistryPostProcessor后置处理器
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// 实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// 对实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法
registryProcessors.addAll(currentRegistryProcessors);
// 执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
// 最后执行没有实现PriorityOrdered和Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器(常规的BeanDefinitionRegistryPostProcessor后置处理器)
boolean reiterate = true;
while (reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
reiterate = true;
}
}
// 对常规的BeanDefinitionRegistryPostProcessor后置处理器进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法
registryProcessors.addAll(currentRegistryProcessors);
// 执行常规的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
// 激活类型是BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanFactory()方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
// 激活硬编码注册的常规后置处理器BenFactoryPostProcessor后置处理器
// 常规的意思是指不是BeanDefinitionRegistryPostProcessor类型的后置处理器,但是BeanFactoryPostProcess类型的后置处理器
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
// 执行上下文中注册的工厂处理器
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
// 获取所有BeanFactoryPostProcessor 类型的后置处理器名称
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
// 对BeanFactoryPostProcessor 后置处理器按照优先级分类
// 实现PriorityOrdered接口的后置处理器
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 实现了Ordered接口的后置处理器的bean名称
List<String> orderedPostProcessorNames = new ArrayList<>();
// 存放常规的没有实现排序接口(PriorityOrdered和Ordered接口)的后置处理器的bean名称
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
// 如果bean已经处理过,不再处理
// skip - already processed in first phase above
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 实现了PriorityOrdered 接口的BeanFactoryPostProcessor 后置处理器
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
// 实现了Ordered 接口的BeanFactoryPostProcessor 后置处理器bean名称
orderedPostProcessorNames.add(ppName);
}
else {
// 没有实现排序的BeanFactoryPostProcessor 后置处理器bean名称
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
// 对实现了PriorityOrdered接口的BeanFactoryPostProcessor后置处理器进行排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 激活实现了PriorityOrdered接口的BeanFactoryPostProcessor后置处理器,既:调用后置处理器的postProcessBeanFactory()方法
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
// 获取实现了Ordered接口的BeanFactoryPostProcessor 后置处理器
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
// 对实现了Ordered接口的BeanFactoryPostProcessor 后置处理器排序
sortPostProcessors(orderedPostProcessors, beanFactory);
// 激活实现了Ordered接口的BeanFactoryPostProcessor 后置处理器,既:调用后置处理器的postProcessBeanFactory()方法
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
// Finally, invoke all other BeanFactoryPostProcessors.
// 没有实现PriorityOrdered和Ordered接口的BeanFactoryPostProcessor 后置处理器
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
// 激活BeanFactoryPostProcessor 后置处理器,既:调用后置处理器的postProcessBeanFactory()方法
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
// Clear cached merged bean definitions since the post-processors might have
// modified the original metadata, e.g. replacing placeholders in values...
beanFactory.clearMetadataCache();
}
6. 注册BeanPostProcessor
我们知道在getBean()的时,实例化bean和初始化bean前后会执行一些后置处理器,那么这些后置处理器是从哪里来的呢?就是在这一步时把所有关于getBean()时所需的后置处理器注册到beanFactory中。在这里不会执行后置处理器,只会把后置处理器加入到beanFactory的属性中,具体的后置处理器执行会在getBean()的时候执行
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
BeanPostProcessor后置处理器注册进beanFactory,具体是由PostProcessorRegistrationDelegate.registerBeanPostProcessors()方法来实现
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 获取注册的BeanPostProcessor后置处理器名称
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// 整个容器中的后置处理器数量
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
// 添加一个打印后置处理器是否全部正常注册成功的后置处理器
// 如果被注册的后置处理器的数量少于整个容器中后置处理器的数量,就打印出信息
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Ordered, and the rest.
// 存放实现了PriorityOrdered接口的BeanPostProcessor
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 存放MergedBeanDefinitionPostProcessor 类型的后置处理器
// MergedBeanDefinitionPostProcessor也是继承BeanPostProcessor接口,具有BeanPostProcessor功能
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
// 存放实现了Ordered接口的BeanPostProcessor
List<String> orderedPostProcessorNames = new ArrayList<>();
// 存放没有实现PriorityOrdered和Ordered排序接口的BeanPostProcessor,注册时不用保证顺序
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
// 实现了PriorityOrdered接口的后置处理器
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 获取后置处理器bean
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 将实现了PriorityOrdered接口的后置处理器加入到对应集合,在后续统一注册进BeanFactory中
priorityOrderedPostProcessors.add(pp);
// 如果是MergedBeanDefinitionPostProcessor 类型,单独处理
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
// 将实现了Ordered接口的BeanPostProcessor后置处理器加入到对应集合,在后续统一注册进BeanFactory中
orderedPostProcessorNames.add(ppName);
}
else {
// 没有实现PriorityOrdered和Ordered接口的后置处理器加入对应集合,在后续统一注册进BeanFactory中
nonOrderedPostProcessorNames.add(ppName);
}
}
// 首先对实现了PriorityOrdered接口的BeanPostProcessor后置处理器排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 注册排序好的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 下一步,注册实现了Ordered接口的BeanPostProcessor后置处理器
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String ppName : orderedPostProcessorNames) {
// 获取后置处理器对象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
// 如果是MergedBeanDefinitionPostProcessor 类型,单独处理
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 对实现了Ordered的BeanPostProcessor后置处理器排序
sortPostProcessors(orderedPostProcessors, beanFactory);
// 注册排序好的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// Now, register all regular BeanPostProcessors.
// 注册将没有实现PriorityOrdered和Ordered接口的BeanPostProcessor后置处理器
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
// 获取后置处理器对象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 不用保证有序的后置处理器
nonOrderedPostProcessors.add(pp);
// 如果是MergedBeanDefinitionPostProcessor 类型,单独处理
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 注册剩余没有实现PriorityOrdered和Ordered接口的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中
// 因为是没有实现排序接口的后置处理器,所以不用保证有序就可以直接注册
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 最后,将对是MergedBeanDefinitionPostProcessor类型的后置处理器排序
sortPostProcessors(internalPostProcessors, beanFactory);
// 注册类型是MergedBeanDefinitionPostProcessor 类型的后置处理器
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// 添加ApplicationListener 探测器
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
7. 初始化消息资源
为ApplicationContext初始化消息资源,消息资源可以对不同的消息进行国际化。这个方法的逻辑很简单,如果有自定义消息资源管理器就使用自定义的,没有就使用默认的消息资源管理器
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 如果配置了messageSource就使用配置的
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
// 创建自定义配置的消息资源bean
// 将自定义配置的messageSource对象记录在messageSource变量中
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
// Make MessageSource aware of parent MessageSource.
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
if (hms.getParentMessageSource() == null) {
// Only set parent context as parent MessageSource if no parent MessageSource
// registered already.
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isDebugEnabled()) {
logger.debug("Using MessageSource [" + this.messageSource + "]");
}
}
else {
// 没有配置messageSource,就使用默认的
// Use empty MessageSource to be able to accept getMessage calls.
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
// 将默认的messageSource注册到单实例bean中
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
"': using default [" + this.messageSource + "]");
}
}
}
8. 初始化事件广播器
Spring中为我们提供了事件监听功能,事件的发布都是通过事件广播器来发布的,将事件发布出去,事件监听器就能够监听到事件。事件广播器如果可能在这之前就已经创建,比如启动SpringBoot启动时,会提前创建事件广播器。如果已经创建就使用已经创建的事件广播器,没有就使用默认的事件广播器。
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 监听器存在,直接从beanFactory中获取
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster =
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
if (logger.isDebugEnabled()) {
logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
}
}
else {
// 监听器不存在,注册一个SimpleApplicationEventMulticaster类型的监听器到IOC容器中
// 注册的意思就是将实例对象作为一个单实例bean放到singletonObjects缓存中
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
"': using default [" + this.applicationEventMulticaster + "]");
}
}
}
8.1. 默认事件广播器
SimpleApplicationEventMulticaster 作为默认的事件广播器,里面存放了所有的事件监听器,通过事件广播器发布事件时,会循环调用在事件广播器中的所有监听器
@Override
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
// 遍历监听器,分别执行invokeListener()方法
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
Executor executor = getTaskExecutor();
// 如果有线程任务,异步执行,最终会执行到监听器的onApplicationEvent()方法
if (executor != null) {
// 单独起一个线程,异步执行
executor.execute(() -> invokeListener(listener, event));
}
else {
// 没有线程任务,同步执行监听器的onApplicationEvent()方法
invokeListener(listener, event);
}
}
}
9. 注册监听器
前面我们已经创建了事件广播器,那么这里将会把监听器添加到事件广播器中。如有有早期需要广播的事件,会将早期事件通过事件广播器广播出去。
在通过事件广播器发布事件时,这些被添加到的事件监听器将会监听到事件。这其实就是典型的观察者模式。
protected void registerListeners() {
// 硬编码的方式注册事件监听器
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// 通过配置文件注册的监听器处理
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// 早期事件
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
// 如果有早期事件需要广播,通过事件广播器将事件发布
if (earlyEventsToProcess != null) {
// 循环所有早期事件,通过事件广播器将事件广播出去
// 那些被匹配到的事件监听器将监听到事件
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
10. 创建非延时加载的单例bean
将beanFactory中还没有被创建的单实例bean,进行创建。
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
// 为ApplicationContext添加转换器服务
// 如果容器中存在bean名字为:conversionService的bean,同时类型又是ConversionService.class类型
// 就说明配置了ConverterService,将其添加到beanFactory的conversionService属性中
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}
// Register a default embedded value resolver if no bean post-processor
// (such as a PropertyPlaceholderConfigurer bean) registered any before:
// at this point, primarily for resolution in annotation attribute values.
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
// Stop using the temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(null);
// 冻结所有bean的定义
// 说明在这一步之后,bean的BeanDefinition信息将不能被修改
beanFactory.freezeConfiguration();
// 创建剩余所有还没有被创建的bean
beanFactory.preInstantiateSingletons();
}
10.1. 创建剩余bean
ApplicationContext 的实现默认就是在启动时将所有的非延时加载的bean进行创建,而非等到用到该bean时才创建。这么做的好处就是如果bean的创建存在一些问题,在项目启动时就能够发现,而不是等到项目部署以后,用到某个bean时在创建才发现问题,有时某些bean并不是马上就会用到,可能好几天后才能用到。
在前面的几个步骤我们已经创建了一些bean,接下来就是把那些还没有被创建的bean创建出来。
public void preInstantiateSingletons() throws BeansException {
if (logger.isDebugEnabled()) {
logger.debug("Pre-instantiating singletons in " + this);
}
// 被定义的beanName集合
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// 遍历beanName,创建bean
for (String beanName : beanNames) {
// 根据beanName 获取bean的定义信息
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 校验bean的定义信息
// 只创建非抽象类,是单实例bean,非延迟创建的bean
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 创建FactoryBean类型的bean
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(
(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
// 创建非FatoryBean类型的bean
getBean(beanName);
}
}
}
// Trigger post-initialization callback for all applicable beans...
// 至此,我们已经创建好了所有的非延时加载的bean
// 这里将会对SmartInitializingSingleton 类型的bean,执行它的回调方法
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
// 安全检查的bean
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
// 执行回调方法
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
11. 完成刷新
在Spring的ApplicationContext 创建完成,所有的非延迟加载的单实例bean被创建后,Spring为我们提供了LifeCycle 接口,通过实现这个接口,在最后会调用LifeCycle接口的start()方法,并在Spring关闭时调用LifeCycle的stop()方法。我们可以实现这个接口来扩展一些功能,如:启动一个后台允许的线程,轮询的收集一些允许信息等
protected void finishRefresh() {
// 清除上下文中的resourceCaches缓存
clearResourceCaches();
// 初始化LifeCycle 处理器
// 启动LifeCycle接口的方法是通过这个处理器来启动
initLifecycleProcessor();
// 通过Lifecycle处理器启动LifeCycle 接口的start()
getLifecycleProcessor().onRefresh();
// Publish the final event.
publishEvent(new ContextRefreshedEvent(this));
// Participate in LiveBeansView MBean, if active.
LiveBeansView.registerApplicationContext(this);
}
11.1. 初始化LifeCycleProcessor
创建LifeCycleProcessor处理器,如果有自定义的处理器就创建自定义处理器,没有使用默认的处理器
protected void initLifecycleProcessor() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 如果LifeCycleProcessor已经创建,或者已经定义了处理器的名称:lifecycleProcessor
// 那么通过getBean()获取处理器对象
if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
this.lifecycleProcessor =
beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
if (logger.isTraceEnabled()) {
logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
}
}
else {
// 还没有定义LifeCycleProcessor处理器的名称
// 创建一个默认的处理器,并注册到beanFactory中作为一个单实例bean
DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
defaultProcessor.setBeanFactory(beanFactory);
this.lifecycleProcessor = defaultProcessor;
beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
if (logger.isTraceEnabled()) {
logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +
"[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");
}
}
}
11.2. 启动start()
通过LifeCycle处理器,执行所有实现LifeCycle接口类的start()方法
public void onRefresh() {
// 执行start()
startBeans(true);
// LifeCycle 接口运行中标识
this.running = true;
}
交给startBeans()方法处理
private void startBeans(boolean autoStartupOnly) {
// 从beanFactory获取已经被创建的LifeCycle 的bean
Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
Map<Integer, LifecycleGroup> phases = new HashMap<>();
// 遍历所有LifeCycle bean
lifecycleBeans.forEach((beanName, bean) -> {
// 只允许非自启动和bean是SmartLifeCycle类型,且是自动启动
if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
// 如果实现了Phased接口,根据Phase 分组,如果没有默认组是0
// 将需LifeCycle bean放到各自的组LifeCycleGroup中的members属性中
// 标识这个组中有哪些LifeCycle bean
int phase = getPhase(bean);
LifecycleGroup group = phases.get(phase);
if (group == null) {
// 新建一个组,用于存放本组需要执行的LifeCycle成员
group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);
// 把新建的组放到map中,key为组名称int类型,value 组对象
phases.put(phase, group);
}
// 往组中添加LifeCycle成员
group.add(beanName, bean);
}
});
if (!phases.isEmpty()) {
List<Integer> keys = new ArrayList<>(phases.keySet());
Collections.sort(keys);
// 遍历所有的组
for (Integer key : keys) {
// 执行组里所有成员的start()
phases.get(key).start();
}
}
}
11.2.1. 获取LifeCycle对象
从beanFactory中获取已经加载的LIfeCycle接口的实现对象
protected Map<String, Lifecycle> getLifecycleBeans() {
// 当前ApplicationContext中的beanFactory
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 存放LifeCycle bean,key为beanName,value为LifeCycle对象
Map<String, Lifecycle> beans = new LinkedHashMap<>();
// 获取所有已经被创建的LifeCycle类型的beanName
String[] beanNames = beanFactory.getBeanNamesForType(Lifecycle.class, false, false);
// 遍历所有LifeCycle的beanName
for (String beanName : beanNames) {
// 如果beanName中第一个字符是&,去掉&字符
String beanNameToRegister = BeanFactoryUtils.transformedBeanName(beanName);
// 校验是不是实现了FactoryBean,也就是说是不是FactoryBean类型的bean
boolean isFactoryBean = beanFactory.isFactoryBean(beanNameToRegister);
// 识别beanName
// 如果是FactoryBean类型的bean,获取它的原始bean,需要在beanName前加&字符,否则不用处理beanName
String beanNameToCheck = (isFactoryBean ? BeanFactory.FACTORY_BEAN_PREFIX + beanName : beanName);
// 条件一
// 单实例bean中有beanName是beanNameToRegister 名称的bean
// 并且不是FactoryBean类型,或者根据beanNameToCheck名称能匹配到LifeCycle类型的bean
// 条件二
// 是SmartLifecycle 类型的bean
// 满足其中一个条件即可
if ((beanFactory.containsSingleton(beanNameToRegister) &&
(!isFactoryBean || matchesBeanType(Lifecycle.class, beanNameToCheck, beanFactory))) ||
matchesBeanType(SmartLifecycle.class, beanNameToCheck, beanFactory)) {
// 获取bean的原始实例
// 为什么说是原始实例,是因为如果bean是FactoryBean类型的,通过beanName获取到的是getObject()方法的对象,而不是这个对象本身
// 如果想要获得原始实例,需要在beanName前加&字符
// 非BeanFactory类型的bean,根据beanName就能获取到实例本身
Object bean = beanFactory.getBean(beanNameToCheck);
if (bean != this && bean instanceof Lifecycle) {
// 放到map集合中
beans.put(beanNameToRegister, (Lifecycle) bean);
}
}
}
return beans;
}
11.2.2. 执行start()
LifecycleGroup 中执行本组中所有LifeCycle成员的start()
public void start() {
if (this.members.isEmpty()) {
return;
}
if (logger.isInfoEnabled()) {
logger.info("Starting beans in phase " + this.phase);
}
Collections.sort(this.members);
for (LifecycleGroupMember member : this.members) {
doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);
}
}
11.3. 发布事件
启动完LifeCycle接口的start()方法后,紧接着发布一个ContextRefreshedEvent 事件
protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
Assert.notNull(event, "Event must not be null");
if (logger.isTraceEnabled()) {
logger.trace("Publishing event in " + getDisplayName() + ": " + event);
}
// 如果有需要,将事件对象转换为ApplicationEvent
ApplicationEvent applicationEvent;
if (event instanceof ApplicationEvent) {
applicationEvent = (ApplicationEvent) event;
}
else {
// 非ApplicationEvent类型的事件,装饰为PayloadApplicationEvent 对象
applicationEvent = new PayloadApplicationEvent<>(this, event);
if (eventType == null) {
eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();
}
}
// 早期事件,在注册监听器的时候,会广播事件
if (this.earlyApplicationEvents != null) {
this.earlyApplicationEvents.add(applicationEvent);
}
else {
// 广播事件
getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
}
// Publish event via parent context as well...
if (this.parent != null) {
if (this.parent instanceof AbstractApplicationContext) {
((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
}
else {
this.parent.publishEvent(event);
}
}
}