- // spring启动
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
-
-
- // 调AnnotationConfigApplicationContext构造方法
- public AnnotationConfigApplicationContext(Class>... componentClasses) {
- // 构造DefaultListableBeanFactory、AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner
- this();
- register(componentClasses);
- refresh();
- }
-
-
1. 构造方法, 创建DefaultListableBeanFactory(bean工厂),AnnotatedBeanDefinitionReader(读取器)和ClassPathBeanDefinitionScanner(扫描器)
2. 解析配置类,注册BeanDefinition到BeanFactory, 扫描
3. 准备阶段,添加一些类加载器, el表达式解析器, 类型转换器, 三个BeanPostProcessor, 以及ignoreDependencyInterface和ResolvableDependency
4. 初始化国际化MessageSource对象
5. 初始化事件发布器
6. 把用户定义的ApplicationListener对象添加到ApplicationContext中,等Spring启动完就发布事件
7. 实例化非懒加载单例bean, 存入单例池
8. 调用Lifecycle Bean的start()方法
9. 发布ContextRefreshedEvent事件
- @Override
- public void refresh() throws BeansException, IllegalStateException {
- synchronized (this.startupShutdownMonitor) {
- StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
-
- // Prepare this context for refreshing.
- prepareRefresh();
-
- // Tell the subclass to refresh the internal bean factory.
- // 判断能否重复刷新,并且返回一个BeanFactory, 刷新不代表完全情况,主要是先执行Bean的销毁,然后重新生成一个BeanFactory,再在接下来的步骤中重新去扫描等等
- ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
-
- // Prepare the bean factory for use in this context.
- // 准备BeanFactory
- // 1. 设置BeanFactory的类加载器、SpringEL表达式解析器、类型转化注册器
- // 2. 添加三个BeanPostProcessor,注意是具体的BeanPostProcessor实例对象
- // 3. 记录ignoreDependencyInterface
- // 4. 记录ResolvableDependency
- // 5. 添加三个单例Bean
- prepareBeanFactory(beanFactory);
-
- try {
- // Allows post-processing of the bean factory in context subclasses.
- // 子类来设置一下BeanFactory
- postProcessBeanFactory(beanFactory);
-
- StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
-
- // Invoke factory processors registered as beans in the context.
- // BeanFactory准备好了之后,执行BeanFactoryPostProcessor,开始对BeanFactory进行处理
- // 默认情况下:
- // 此时beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的BeanDefinition
- // 而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor
- // 这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中
- // 注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行
- invokeBeanFactoryPostProcessors(beanFactory); // scanner.scan()
-
- // Register bean processors that intercept bean creation.
- // 将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去
- registerBeanPostProcessors(beanFactory);
-
- beanPostProcess.end();
-
- // Initialize message source for this context.
- // 设置ApplicationContext的MessageSource,要么是用户设置的,要么是DelegatingMessageSource
- initMessageSource();
-
- // Initialize event multicaster for this context.
- // 设置ApplicationContext的applicationEventMulticaster,要么是用户设置的,要么是SimpleApplicationEventMulticaster
- initApplicationEventMulticaster();
-
- // Initialize other special beans in specific context subclasses.
- // 给子类的模板方法
- onRefresh();
-
- // Check for listener beans and register them.
- // 把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件
- 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();
- contextRefresh.end();
- }
- }
- }
obtainFreshBeanFactory()
判断能否重复刷新
调子类的refreshBeanFactory方法获取bean
prepareBeanFactory(beanFactory)
invokeBeanFactoryPostProcessors:执行BeanFactoryPostProcessor
registerBeanPostProcessors:把BeanFactory中所有的BeanPostProcessor找出来并实例化得到一个对象,并添加到BeanFactory中去
initMessageSource:如果BeanFactory中存在一个叫messageSource的BeanDefinition,那么会把这个Bean对象创建出来并赋值给ApplicationContext的messageSource属性,让ApplicationContext拥有国际化的功能
initApplicationEventMulticaster: 如果BeanFactory中存在一个叫做"applicationEventMulticaster"的BeanDefinition,那么会把这个Bean对象创建出来并赋值给ApplicationContext的applicationEventMulticaster属性,让ApplicationContext拥有事件发布的功能
onRefresh:子类模板方法, 扩展点
registerListeners:把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件
finishBeanFactoryInitialization:完成BeanFactory的初始化,实例化非懒加载的单例Bean
finishRefresh
设置lifecycleProcessor
调用LifecycleBean的start
发布ContextRefreshedEvent事件