Spring IOC容器初始化
以下源碼分析是根據(jù)spring-context:5.1.8:RELEASE版本進行分析的,歡迎參考學習
this():
調(diào)用父類GenericApplicationContext構造函數(shù)茎毁,構建beanFactory (newDefaultListableBeanFactory())
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
初始化:注解bean的定義讀取器
獲取bean工廠
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
bean的定義Set集合
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
檢查各個組件是否已經(jīng)注冊過了停撞,沒有注冊就將其放入beandefs中去。
- org.springframework.context.annotation.ConfigurationClassPostProcessor//解析@Configuration配置bean定義后置處理器承绸,在bean定義完成之后執(zhí)行,因為實現(xiàn)的是BeanDefinitionRegistryPostProcessor
- org.springframework.context.event.DefaultEventListenerFactory//注冊事件監(jiān)聽器工廠
- org.springframework.context.event.EventListenerMethodProcessor//處理監(jiān)聽方法的注解解析器
- org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor//解析Autowired
- org.springframework.context.annotation.CommonAnnotationBeanPostProcessor//解析JSR規(guī)范的
初始化:classPath的定義掃描器 用于掃描注解的一些bean
this.includeFilters.add(new AnnotationTypeFilter(Component.class));//讓我們的compent能夠被識別
this.includeFilters.add(new AnnotationTypeFilter(
((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));//JSR-250的注解規(guī)范
this.includeFilters.add(new AnnotationTypeFilter(
((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));//JSR-330的注解規(guī)范
register(annotatedClasses);
注冊配置類:將配置類注冊到容器中去,可以傳入多個配置類依次進行遍歷注冊莱预。
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
設置bean定義的屬性:是否懶加載,Bean初始化銷毀的順序项滑、是否首選依沮、設置依賴、描述等等
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
最后將definitionHolder注冊到容器中去枪狂。
refresh()【創(chuàng)建刷新】(重點工作);
源碼如下:
// 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();
}
1危喉、prepareRefresh()
刷新前的預處理;
1)、initPropertySources()
? 初始化一些屬性設置;子類自定義個性化的屬性設置方法州疾;空方法需要子類繼承實現(xiàn)辜限。
2)、getEnvironment().validateRequiredProperties();
? 檢驗屬性的合法等
3)严蓖、earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();
? 保存容器中的一些早期的事件列粪;
2、obtainFreshBeanFactory();
獲取BeanFactory谈飒;
1)岂座、refreshBeanFactory();刷新 只允許bean工廠刷新一次诫给,設置id配紫;
2)、getBeanFactory();返回剛才GenericApplicationContext創(chuàng)建的BeanFactory對象翘鸭;
3)手素、將創(chuàng)建的BeanFactory【DefaultListableBeanFactory】返回鸳址;
3、prepareBeanFactory(beanFactory);
BeanFactory的預準備工作(BeanFactory進行一些設置)泉懦;
1)稿黍、設置BeanFactory的類加載器、支持表達式解析器...
2)崩哩、添加感知回調(diào)的后置處理器巡球,BeanPostProcessor【ApplicationContextAwareProcessor】
3)言沐、設置忽略的感知自動裝配的接口
EnvironmentAware、EmbeddedValueResolverAware酣栈、ResourceLoaderAware险胰、ApplicationEventPublisherAware、MessageSourceAware矿筝、ApplicationContextAware起便;
4)、注冊可以解析的自動裝配窖维;我們能直接在任何組件中自動注入:
BeanFactory榆综、ResourceLoader、ApplicationEventPublisher铸史、ApplicationContext
5)奖年、添加早期BeanPostProcessor,用于發(fā)現(xiàn)內(nèi)部bean
ApplicationListenerDetector
6)沛贪、添加編譯時的AspectJ切面代碼織入陋守;后置處理器
LoadTimeWeaverAwareProcessor
7)、給BeanFactory中注冊一些環(huán)境的組件利赋;
environment【ConfigurableEnvironment】水评、
systemProperties【Map<String, Object>】、
systemEnvironment【Map<String, Object>】
4媚送、postProcessBeanFactory(beanFactory);
BeanFactory準備工作完成后進行的后置處理工作中燥;
1)、子類通過重寫這個方法來在BeanFactory創(chuàng)建并預準備完成以后做進一步的設置塘偎,可以給beanfactory添加一些自己想要實現(xiàn)的bean工廠后置處理器疗涉。
5、invokeBeanFactoryPostProcessors(beanFactory);
執(zhí)行BeanFactoryPostProcessor的方法吟秩;執(zhí)行bean工廠的后置處理器
BeanFactoryPostProcessor:BeanFactory的后置處理器咱扣。在BeanFactory標準初始化之后執(zhí)行的;
兩個接口:BeanFactoryPostProcessor涵防、BeanDefinitionRegistryPostProcessor
5.1先執(zhí)行BeanDefinitionRegistryPostProcessor
1)闹伪、獲取所有的BeanDefinitionRegistryPostProcessor;
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
2)壮池、看先執(zhí)行實現(xiàn)了PriorityOrdered優(yōu)先級接口的BeanDefinitionRegistryPostProcessor偏瓤、
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
3)、在執(zhí)行實現(xiàn)了Ordered順序接口的BeanDefinitionRegistryPostProcessor椰憋;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
4)厅克、最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或者是順序接口的BeanDefinitionRegistryPostProcessors;
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
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;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
5.2再執(zhí)行BeanFactoryPostProcessor的方法
1)橙依、獲取所有的BeanFactoryPostProcessor
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
2)证舟、看先執(zhí)行實現(xiàn)了PriorityOrdered優(yōu)先級接口的BeanFactoryPostProcessor硕旗、
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
?
3)、在執(zhí)行實現(xiàn)了Ordered順序接口的BeanFactoryPostProcessor褪储;
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
4)卵渴、最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或者是順序接口的BeanFactoryPostProcessor慧域;
// Finally, invoke all other BeanFactoryPostProcessors.
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
檢測LoadTimeWeaver鲤竹,并準備代碼織入,注冊一個LoadTimeWeaver的bean后置處理器
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
6昔榴、registerBeanPostProcessors(beanFactory);
注冊BeanPostProcessor(Bean的后置處理器)【 intercept bean creation】
? 不同接口類型的BeanPostProcessor辛藻;在Bean創(chuàng)建前后的執(zhí)行時機是不一樣的
? BeanPostProcessor、
? DestructionAwareBeanPostProcessor互订、
? InstantiationAwareBeanPostProcessor吱肌、
? SmartInstantiationAwareBeanPostProcessor、
? MergedBeanDefinitionPostProcessor【internalPostProcessors】仰禽、
1)氮墨、獲取所有的 BeanPostProcessor;后置處理器都默認可以通過PriorityOrdered、Ordered接口來執(zhí)行優(yōu)先級
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
2)吐葵、注冊一個BeanPostProcessorChecker
BeanPostProcessorChecker在一個Bean不能被所有BeanPostProcessor處理時规揪,會打印信息。
3)温峭、對所有的bean后置處理器進行分類排序
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
2)猛铅、先注冊PriorityOrdered優(yōu)先級接口的BeanPostProcessor;
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
? 把每一個BeanPostProcessor凤藏;添加到BeanFactory中
? beanFactory.addBeanPostProcessor(postProcessor);
3)奸忽、再注冊Ordered接口的
// Next, register the BeanPostProcessors that implement Ordered.
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
4)、最后注冊沒有實現(xiàn)任何優(yōu)先級接口的
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
5)揖庄、最終注冊重新注冊所有的內(nèi)部bean后置處理器苛萎;
// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
6)翘盖、重新注冊一個ApplicationListenerDetector;
用于發(fā)現(xiàn)內(nèi)部bean是否是一個ApplicationListener
// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
7混弥、initMessageSource();
初始化MessageSource組件(做國際化功能;消息綁定,消息解析)嗽冒;MessageSource:取出國際化配置文件中的某個key的值帅腌;能按照區(qū)域信息獲饶缰啊痛倚;
1)抒蚜、獲取BeanFactory
2)、看容器中是否有id為messageSource的耘戚,類型是MessageSource的組件
如果有賦值給messageSource嗡髓,如果沒有自己創(chuàng)建一個DelegatingMessageSource;
3)收津、把創(chuàng)建好的MessageSource注冊在容器中饿这,以后獲取國際化配置文件的值的時候,可以自動注入MessageSource朋截;
// Use empty MessageSource to be able to accept getMessage calls.
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);
8蛹稍、initApplicationEventMulticaster();
初始化應用事件派發(fā)器(多播器)吧黄;
1)部服、獲取BeanFactory
2)、從BeanFactory中獲取applicationEventMulticaster的ApplicationEventMulticaster拗慨;
3)廓八、如果上一步?jīng)]有配置;創(chuàng)建一個SimpleApplicationEventMulticaster
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
4)赵抢、將創(chuàng)建的ApplicationEventMulticaster添加到BeanFactory中剧蹂,以后其他組件直接自動注入
9、onRefresh();
留給子類擴展烦却,子類重寫這個方法宠叼,在單例bean被初始化之前調(diào)用;
10其爵、registerListeners();
檢查偵聽器bean并注冊它們
1冒冬、首先注冊靜態(tài)指定的偵聽器。
2摩渺、從容器中拿到所有的ApplicationListener简烤,不要在這里初始化factorybean:我們需要保留所有常規(guī)bean未初始化,讓后處理器應用到它們!將每個監(jiān)聽器添加到事件派發(fā)器中摇幻;
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3横侦、派發(fā)之前步驟產(chǎn)生的事件;
11绰姻、finishBeanFactoryInitialization(beanFactory);【重點步驟】
初始化所有剩下的(非懶加載)單實例bean枉侧;
1、bean設置類型轉(zhuǎn)換器(conversion service)狂芋、添加默認的值解析器(EmbeddedValueResolver)凍結所有的bean定義榨馁,不讓修改了,等前置操作不進行細致分析了
2银酗、beanFactory.preInstantiateSingletons();初始化后剩下的單實例bean
1)辆影、獲取容器中的所有beanNames徒像,依次進行初始化和創(chuàng)建對象
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
? 2)、遍歷獲取Bean的定義信息蛙讥;RootBeanDefinition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
? 3)锯蛀、不是抽象的,是單實例的次慢,不是懶加載的bean進入下面步驟旁涤;
? 判斷是否是工廠Bean;是否是實現(xiàn)FactoryBean接口的Bean迫像;
利用getBean(beanName);創(chuàng)建對象劈愚,以下是調(diào)用doGetBean(name, null, null, false);方法
3.1、先獲取緩存中保存的單實例Bean闻妓。如果能獲取到說明這個Bean之前被創(chuàng)建過(所有創(chuàng)建過的單實例Bean都會被緩存起來)
Object sharedInstance = getSingleton(beanName);
如果獲取到的實例不為空但是args為空菌羽,說明正在該bean還沒有初始化完,存在循環(huán)引用由缆,調(diào)用getObjectForBeanInstance方法獲取bean注祖;從factoryBeanObjectCache中返回一個bean出去
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);//一級緩存,存放已經(jīng)創(chuàng)建好的bean均唉,先從這里獲取
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);//早期的單實例對象是晨,提前曝光的單例對象的cache,存放原始的 bean 對象(尚未填充屬性)舔箭,用于解決循環(huán)依賴罩缴,正在創(chuàng)建中的,再從這里獲取
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);//單實例工廠的緩存层扶,最后從這里獲取箫章,單例對象工廠的cache,存放 bean 工廠對象怒医,用于解決循環(huán)依賴炉抒,如果獲取到了就把對象移動到二級緩存中去。
//以上三個緩存中都獲取不到說明bean沒有被創(chuàng)建
private final Set<String> singletonsCurrentlyInCreation =
Collections.newSetFromMap(new ConcurrentHashMap<>(16));//正在創(chuàng)建中的bean都會存在這個map里面
private final Set<String> registeredSingletons = new LinkedHashSet<>(256);//已經(jīng)注冊好的單實例會放到其中去
//FactoryBeanRegistrySupport類中的緩存
private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);//被工廠bean創(chuàng)建的單實例對象稚叹,Spring注冊的 bean是 FactoryBean的話焰薄、這個 FactoryBean存放在三級緩存中、FactoryBean產(chǎn)生的 bean緩存在這里
? 3.2扒袖、緩存中獲取不到塞茅,開始Bean的創(chuàng)建對象流程;判斷當前bean是否正在創(chuàng)建中季率,
// Fail if we're already creating this bean instance:
// We're assumably within a circular reference.
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);//重復創(chuàng)建會拋出異常野瘦,
}
if (!typeCheckOnly) {
markBeanAsCreated(beanName);//標記這個bean正在創(chuàng)建中
}
? 3.3、獲取Bean的定義信息;
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
? 3.4鞭光、獲取當前Bean依賴的其他Bean;如果有按照getBean()把依賴的Bean先創(chuàng)建出來吏廉;
String[] dependsOn = mbd.getDependsOn();
? 3.5、判斷是否單實例bean惰许,啟動單實例Bean的創(chuàng)建流程席覆;(我這里只分析一下單實例bean,多實例的bean是不被ioc容器管理的)
? 執(zhí)行getSingleton()汹买,里面執(zhí)行createBean(beanName, mbd, args);方法佩伤,
? 3.5.1、復制bean的定義信息和準備方法覆蓋
? 3.5.2晦毙、給BeanPostProcessors一個返回目標實例代理對象的機會
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
? 3.5.2.1生巡、讓BeanPostProcessor先攔截返回代理對象;InstantiationAwareBeanPostProcessor:提前執(zhí)行见妒;
? 先觸發(fā):postProcessBeforeInstantiation()孤荣;
? 如果有返回值:觸發(fā)postProcessAfterInitialization();
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
? 3.5.3徐鹤、如果獲取到的代理對象為null垃环;以下是執(zhí)行doCreateBean()方法邀层,
Object beanInstance = doCreateBean(beanName, mbdToUse, args);//創(chuàng)建Bean
=========================================================================================================================
? 3.5.3.1返敬、獲取實例包裝對象,先從factoryBeanInstanceCache中刪除該bean寥院,未完成的FactoryBean實例的緩存劲赠。獲取instanceWrapper
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
? 3.5.3.2、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
? 后置處理器處理bean定義信息 調(diào)用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
? 3.5.3.3秸谢、快速緩存單例凛澎,以便能夠解決循環(huán)引用
if (!this.singletonObjects.containsKey(beanName)) {
this.singletonFactories.put(beanName, singletonFactory);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
}
? 3.5.3.4、【Bean屬性賦值】
populateBean(beanName, mbd, instanceWrapper);
? 1)估蹄、拿到InstantiationAwareBeanPostProcessor后置處理器塑煎;
? postProcessAfterInstantiation();
? 2)臭蚁、拿到InstantiationAwareBeanPostProcessor后置處理器最铁;
? postProcessPropertyValues();
? 3)垮兑、應用Bean屬性的值冷尉;為屬性利用setter方法等進行賦值;
? applyPropertyValues(beanName, mbd, bw, pvs);
? 3.5.3.5系枪、【Bean初始化】initializeBean(beanName, exposedObject, mbd);
? 1)雀哨、【執(zhí)行Aware接口方法】invokeAwareMethods(beanName, bean);執(zhí)行xxxAware接口的方法
? BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
? 2)、【執(zhí)行后置處理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
? BeanPostProcessor.postProcessBeforeInitialization();
? 3)、【執(zhí)行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
? 1)雾棺、是否是InitializingBean接口的實現(xiàn)膊夹;執(zhí)行接口規(guī)定的初始化;
? 2)捌浩、是否自定義初始化方法割疾;
? 4)、【執(zhí)行后置處理器初始化之后】applyBeanPostProcessorsAfterInitialization
? BeanPostProcessor.postProcessAfterInitialization()嘉栓;
? 5)宏榕、返回包裝weappedBean
? 3.5.3.6、注冊Bean的銷毀方法侵佃;
registerDisposableBeanIfNecessary(beanName, bean, mbd);
=========================================================================================================================
3.6麻昼、將創(chuàng)建的Bean添加到緩存中singletonObjects;
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, singletonObject);//單例對象的緩存 Map<String, Object>
this.singletonFactories.remove(beanName);//單例工廠的緩存馋辈,從三級緩存中刪除抚芦。
this.earlySingletonObjects.remove(beanName);//早期單例對象的緩存,二級緩存中也刪除迈螟。
this.registeredSingletons.add(beanName);//一組已注冊的單例對象叉抡,按注冊順序包含bean名稱。Set<String>
}
?
? 4)答毫、所有Bean都利用getBean創(chuàng)建完成以后褥民;觸發(fā)初始化后回調(diào)
? 檢查所有的Bean是否是SmartInitializingSingleton接口的;如果是洗搂;就執(zhí)行afterSingletonsInstantiated()消返;
12、finishRefresh();
完成BeanFactory的初始化創(chuàng)建工作耘拇;IOC容器就創(chuàng)建完成撵颊;
1)、clearResourceCaches();清除資源緩存
2)惫叛、initLifecycleProcessor();初始化和生命周期有關的后置處理器倡勇;LifecycleProcessor
默認從容器中找是否有l(wèi)ifecycleProcessor的組件【LifecycleProcessor】;
如果沒有new DefaultLifecycleProcessor();加入到容器嘉涌;
DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
defaultProcessor.setBeanFactory(beanFactory);
this.lifecycleProcessor = defaultProcessor;
3)妻熊、 getLifecycleProcessor().onRefresh();
拿到前面定義的生命周期處理器(BeanFactory);回調(diào)onRefresh()洛心;
4)固耘、publishEvent(new ContextRefreshedEvent(this));發(fā)布容器刷新完成事件;
5)词身、liveBeansView.registerApplicationContext(this);java管理拓展厅目;