Spring IOC容器啟動源碼分析

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管理拓展厅目;

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子损敷,更是在濱河造成了極大的恐慌葫笼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拗馒,死亡現(xiàn)場離奇詭異路星,居然都是意外死亡,警方通過查閱死者的電腦和手機诱桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門洋丐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挥等,你說我怎么就攤上這事友绝。” “怎么了肝劲?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵迁客,是天一觀的道長。 經(jīng)常有香客問我辞槐,道長掷漱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任榄檬,我火速辦了婚禮卜范,結果婚禮上,老公的妹妹穿的比我還像新娘丙号。我一直安慰自己先朦,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布犬缨。 她就那樣靜靜地躺著棉浸,像睡著了一般迷郑。 火紅的嫁衣襯著肌膚如雪焚碌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天台盯,我揣著相機與錄音,去河邊找鬼蒿叠。 笑死,一個胖子當著我的面吹牛魂务,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孤紧,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躺酒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雳刺?” 一聲冷哼從身側(cè)響起供汛,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒲犬,失蹤者是張志新(化名)和其女友劉穎原叮,沒想到半個月后悦荒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搬味,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡悦析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡宙,死狀恐怖钞馁,靈堂內(nèi)的尸體忽然破棺而出熟丸,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布铐炫,位于F島的核電站,受9級特大地震影響堤结,放射性物質(zhì)發(fā)生泄漏唆迁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一竞穷、第九天 我趴在偏房一處隱蔽的房頂上張望唐责。 院中可真熱鬧,春花似錦瘾带、人聲如沸鼠哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朴恳。三九已至,卻和暖如春允蚣,著一層夾襖步出監(jiān)牢的瞬間于颖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工嚷兔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留森渐,地道東北人做入。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像同衣,于是被迫代替她去往敵國和親竟块。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355