[KANMARS原创] - SPRING源码解析-AbstractApplicationContext
包含最重要的Spring方法 refresh
内部调用顺序
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
// 初始化环境,包含Environment StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[systemProperties,systemEnvironment]}
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 初始化BeanFactory, DefaultListableBeanFactory
// 包含
// 1、加载Resources XmlBeanDefinitionReader ResourcePatternResolver DefaultResourceLoader
// 2、根据Resources加载BeanDefinition BeanDefinitionParserDelegate BeanDefinitionHolder GenericBeanDefinition
// 3、注册BeanDefinition到BeanFactory中 BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
// 4、通知Bean定义事件 getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder)); 内部将依赖的BeanDefinition进行依赖添加innerBeanDefinitions,beanReferences
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
// 对BeanFactory进行预处理
// 1、设置默认值,如classloader等
// 2、设置默认处理对象ApplicationContextAwareProcessor
// 3、设置被忽略的依赖接口 ignoredDependencyInterfaces,如ResourceLoaderAware,ApplicationEventPublisherAware等
// 4、设置被忽略的依赖类 resolvableDependencies,如BeanFactory.class等
// 5、如果包含运行时注入类 loadTimeWeaver,则添加BeanFactoryProcess对象
// 6、注册一些默认Bean beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
// beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
// beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
// 1、执行 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry注册前时间处理
// 2、通过beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class, true, false); 获取所有的BeanDefinitionRegistryPostProcessor
// 3、执行invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory); 执行注册前的BeanFactoryProcessor
// 4、invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory); 执行注册的
// 5、invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
// 1、注册BeanPostProcessors
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
// 1、初始化DelegatingMessageSource 信息国际化
initMessageSource();
// Initialize event multicaster for this context.
// 1、初始化Spring事件体系 SimpleApplicationEventMulticaster,通过multicastEvent方法可以对增加的ApplicationListener通知消息
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
// 初始化其他Bean,暂为空方法
onRefresh();
// Check for listener beans and register them.
// 1、对Listeners进行注册
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
// 对Bean进行初始化,执行BeanPostProcessors
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
// 刷新生命周期对象
// 发送初始化结束信号
// 在全局上下文视图中注册ApplicationContext
// LiveBeansView.registerApplicationContext(this);
finishRefresh();
}
catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset ‘active’ flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}