refresh
prepareRefresh();<br>刷新上下文前准备
this.closed.set(false);<br> this.active.set(true);<br>设置AC状态
initPropertySources();<br>钩子方法:在上下文环境中指定初始化占位符属性源
getEnvironment().validateRequiredProperties();<br>验证所有标记为必须的属性都可以解析。<br>ConfigurablePropertyResolver#setRequiredProperties<br>
earlyApplicationListeners如果不为null,那么里面存的就是在pre-refresh之前注册到AC的监听器,只要调用过refresh方法就不会为null。<br>earlyApplicationEvents如果不为null,说明监听器还没有注册到applicationEventMulticaster,里面暂存的事件会等到监听器注册完毕后进行处理,处理完成后会置为null<br>
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();<br>告诉子类刷新内部的BF,并返回刷新后的BF。内部调用两个方法都是抽象方法,待子类实现。
refreshBeanFactory();
return getBeanFactory();
prepareBeanFactory(beanFactory);<br>预处理BF,进行一些默认配置
beanFactory.setBeanClassLoader(getClassLoader());<br>设置BF使用上下文的类加载器
if (!shouldIgnoreSpel) {<br> beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));<br> }<br>如果没有忽略SpEL,设置SpEL作为默认的表达式解析器
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));<br>新增PropertyEditor
通过注册BeanPostProcessor,来处理这些接口的回调<br>ignoreDependencyInterface:自动装配时忽略给定的依赖接口,这通常用于AC来注册通过其他方式解析的依赖。<br>例如BF通过BeanFactoryAware,AC通过ApplicationContextAware。默认只有BeanFactoryAware接口被忽略。
registerResolvableDependency:注册一个特殊的依赖类型及其关联的自动装配值。这用于容器引用,它们可以被自动装配却没有在<br>工厂中定义为bean.
通过注册BeanPostProcessor,来处理注册inner bean中的单例的ApplicationListener
探测加载时织入器,加载时织入可以通过在加载类字节码时更改字节码,来增强类的行为。
注册默认的环境bean:environment,systemProperties,systemEnvironment,applicationStartup
准备工作执行完毕,进入初始化阶段,try-catch
postProcessBeanFactory(beanFactory);<br>钩子方法,让子类注册BeanFactoryProcessor
invokeBeanFactoryPostProcessors(beanFactory);<br>调用容器中注册的BeanFactoryPostProcessor。<br>BFPP执行时,所有的bean都加载了,但是没有初始化。<br>这允许BFPP可以在初始化bean前给bean更改或增加属性<br>
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());<br>调用BFPP的postProcessBeanFactory方法。该方法中提到了两种BFPP:BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor。<br>后者是通常的BFPP,前者扩展了后者,多定义了方法postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry),它允许在执行下<br>一步postProcessBeanFactory之前对bean定义注册表进行操作,包括新增bean定义。<br>
STEP 1<br>如果当前的BF实现了BeanDefinitionRegistry,那么需要额外处理BeanDefinitionRegistryPostProcessor<br>1. 处理AC传过来的beanFactoryPostProcessors,调用它们的postProcessBeanDefinitionRegistry方法<br>2. 处理BF中注册为Bean的BeanDefinitionRegistryPostProcessor<br> a. 处理匹配PriorityOrdered接口的,先排序再处理<br> b. 处理匹配Ordered接口的,先排序再处理<br> c. 处理其他的,由于在上述处理过程中可能向BF中注册了新的BDRPP,所以要不断地检查,直到没有新的BDRPP产生。<br>3. 调用所有BFPP(和BDRPP)的postProcessBeanFactory方法<br><br>如果当前的BF没有实现BeanDefinitionRegistry,那么直接处理AC传过来的beanFactoryPostProcessors<br>调用它们的postProcessBeanFactory方法<br>
STEP 2<br>处理BF中注册为Bean的BFPP<br>a. 处理匹配PriorityOrdered接口的,先排序再处理,调用它们的postProcessBeanFactory方法<br> b. 处理匹配Ordered接口的,先排序再处理,调用它们的postProcessBeanFactory方法<br>c. 处理其他的,调用它们的postProcessBeanFactory方法<br>
registerBeanPostProcessors(beanFactory);<br>将BPP注册到BF,便于在初始化Bean时对Bean进行处理
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);<br>将BPP注册到BF
处理BF中注册为Bean的BPP<br>1. 首先注册BeanPostProcessorChecker,用于打印日志<br>2. 注册匹配PriorityOrdered接口的,先排序再注册<br>3. 注册匹配Ordered接口的,先排序再注册<br>4. 注册其他BPP<br>5. 将实现了MergedBeanDefinitionPostProcessor的BPP重新注册,先排序再注册<br>6. 重新注册ApplicationListenerDetector
重新注册会先移除,再注册,所以重新注册是为了保证BPP的执行顺序
initMessageSource();<br>注册messageSource,确保有messageSource存在
initApplicationEventMulticaster();<br>注册applicationEventMulticaster,确保有applicationEventMulticaster存在
onRefresh();<br>钩子方法,允许子类初始化其他特殊的Bean
registerListeners();<br>注册监听器,并发布早期应用事件
1 将监听器注册到applicationEventMulticaster<br> AC中注册的监听器+BF中注册为bean的监听器ApplicationListener<br>2 将早期产生的事件交给applicationEventMulticaster处理
finishBeanFactoryInitialization(beanFactory);<br>实例化所有剩余的(非延迟初始化)单例
1 如果有则设置并初始化转换服务conversionService<br>2 如果BF中没有内置的valueResolver,设置默认的valueResolver<br>3 初始化LoadTimeWeaverAware bean使它们尽早注册transformer<br>4 不再使用临时的用于类型匹配的类加载器<br>5 锁定配置,不允许再对bean定义做修改<br>6 实例化所有剩余的(非延迟初始化)单例
beanFactory.preInstantiateSingletons();
AbstractBeanFactory#getBean
AbstractBeanFactory#doGetBean
DefaultSingletonBeanRegistry#getSingleton 三级缓存查找
DefaultSingletonBeanRegistry#getSingleton(String beanName, ObjectFactory<?> singletonFactory)
ObjectFactory#getObject
AbstractAutowireCapableBeanFactory#createBean
AbstractAutowireCapableBeanFactory#doCreateBean
AbstractAutowireCapableBeanFactory#createBeanInstance
AbstractAutowireCapableBeanFactory#addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 暴露早期bean,解决环形依赖
AbstractAutowireCapableBeanFactory#populateBean
autowire -> getBean
AbstractAutowireCapableBeanFactory#initializeBean
DefaultSingletonBeanRegistry#addSingleton(beanName, singletonObject);
finishRefresh();<br>初始化LifecycleProcessor并调用它的onRefresh方法<br>发布ContextRefreshedEvent事件
1 清除资源缓存<br>2 初始化lifecycleProcessor确保它存在<br>3 调用lifecycleProcessor的onRefresh方法<br>4 发布ContextRefreshedEvent
try结束,如果在上述过程中发生异常
destroyBeans();<br>销毁在BF中初始化的缓存单例
cancelRefresh(ex);<br>重置active标志位false
进入finally<br>清除掉Spring中公共的内省缓存,<br>因为不再需要单例bean的元数据了
close<br>调用doClose,并移除不再需要的已注册的JVM shutdownHook<br>
doClose
1 如果AC可用并且没有关闭,执行关闭操作<br>2 发布ContextClosedEvent事件<br>3 调用lifecycleProcessor的onClose方法<br>4 销毁在BF中初始化的缓存单例<br>5 调用onClose钩子方法,让子类执行一些清理工作<br>6 将监听器恢复到容器准备刷新的状态<br>7 将容器设置为未激活this.active.set(false);
Runtime.getRuntime().removeShutdownHook(this.shutdownHook);