context刷新源码解析
这个方法里面是刷新的所有操作,下面我们来分析这个方法
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
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();
}
}
}
prepareRefresh()
方法:初始化ServletContext
的属性和验证AbstractPropertyResolver
的requiredProperties
属性,但实际上ServletContext
和requiredProperties
都为null
,所有这个方法实际上没有做任何处理
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
获取Context
的beanFactory
,实际上是DefaultListableBeanFactory
,
prepareBeanFactory(beanFactory)
方法设置beanFactory
的属性和注册一些bean
给beanFactory设置了ClassLoader
给beanFactory设置了SpEL解析器
给beanFactory设置了PropertyEditorRegistrar
给beanFactory添加了ApplicationContextAwareProcessor(BeanPostProcessor的实现类),需要注意的是它是第一个被添加到BeanFactory的BeanPostProcessor
给beanFactory设置忽略解析以下类的依赖:ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware、EnvironmentAware。原因是注入这些回调接口本身没有什么意义。
给beanFactory添加了以下类的依赖解析:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
给beanFactory添加LoadTimeWeaverAwareProcessor用来处理LoadTimeWeaverAware的回调,在和AspectJ集成的时候会用到
把getEnvironment()作为Bean添加到beanFactory中,Bean Name: environment
把getEnvironment().getSystemProperties()作为Bean添加到beanFactory中,Bean Name: systemProperties
把getEnvironment().getSystemEnvironment()作为Bean添加到beanFactory中,Bean Name: systemEnvironment
postProcessBeanFactory(beanFactory)
方法
invokeBeanFactoryPostProcessors(beanFactory)
方法
先执行BeanDefinitionRegistryPostProcessor
的postProcessBeanDefinitionRegistry()
,再执行BeanFactoryPostProcessor
的postProcessBeanFactory()
,同时实现BeanDefinitionRegistryPostProcessor
和BeanFactoryPostProcessor
的类以及被依赖的类会在这一步被实例化
-
BeanFactoryPostProcessor
对ConfigurableListableBeanFactory
进行post处理 -
BeanDefinitionRegistryPostProcessor
对BeanDefinitionRegistry
进行处理
BeanDefinitionRegistryPostProcessorSharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor ConfigurationWarningsApplicationContextInitializer$ConfigurationWarningsPostProcessor ConfigurationClassPostProcessor
BeanFactoryPostProcessor
ConfigurationWarningsApplicationContextInitializer$ConfigurationWarningsPostProcessor SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor ConfigurationClassPostProcessor ConfigFileApplicationListener$PropertySourceOrderingPostProcessor PropertySourcesPlaceholderConfigurer ConfigurationBeanFactoryMetaData ErrorMvcAutoConfiguration$PreserveErrorControllerTargetClassPostProcessor ConfigurationBeanFactoryMetaData ErrorMvcAutoConfiguration$PreserveErrorControllerTargetClassPostProcessor
ConfigurationClassPostProcessor
负责扫描所有的bean,并生成BeanDefinition
registerBeanPostProcessors(beanFactory)
方法
注册BeanPostProcessor
initMessageSource()
方法
注册messageSource
,主要用于国际化
initApplicationEventMulticaster()
方法
注册applicationEventMulticaster
,类SimpleApplicationEventMulticaster
主要用于事件的通知
onRefresh()
方法
初始化在context
父类中需要的特定的bean
,ThemeSource
和EmbeddedServletContainer
registerListeners()
方法
将ApplicationListener
添加到applicationEventMulticaster
中,并且将之前因为没有ApplicationEventMulticaster而无法发出的ApplicationEvent发送出去
finishBeanFactoryInitialization(beanFactory)
方法
这一步的时候才会实例化所有non-lazy-init bean,这里说的实例化不只是new而已,注入、BeanPostProcessor都会执行。例如利用@Aspect
实现的AOP功能就是在AnnotationAwareAspectJAutoProxyCreator
这个BeanPostProcessor
实现的
BeanPostProcessor
ConfigurationPropertiesBindingPostProcessor //属性绑定?
AutowiredAnnotationBeanPostProcessor //给bean设置属性值?
EmbeddedServletContainerCustomizerBeanPostProcessor //设置内置Tomcat属性
finishRefresh()
方法
注册Lifecycle
,类DefaultLifecycleProcessor
,发送了ContextRefreshedEvent
ConfigurationPropertiesBindingPostProcessor
ConfigFileApplicationListener
DelegatingApplicationListener
AutoConfigurationReportLoggingInitializer$AutoConfigurationReportListener
ClearCachesApplicationListener
ResourceUrlProvider
SharedMetadataReaderFactoryContextInitializer$SharedMetadataReaderFactoryBean