<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring IOC源碼分析 ,寫得真好!

          共 16938字,需瀏覽 34分鐘

           ·

          2021-11-18 10:51

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質文章,第一時間送達

          Spring容器初始化

          本文使用的是Spring 5.1.7版本

          寫在前面:我們看源碼一般有3種方式。

          • 第一種直接用class文件,IDEA會幫我們反編譯成看得懂的java代碼

          • 第二種是用maven的download Sources

          • 第三種是直接下載源碼編譯

          如果隨便看看,那么第二種就行了。如果想仔細研究,可以選第三種,這樣可以給代碼加注釋,或者修改一些東西等等。

          Spring源碼構建

          • 下載源碼(github)

          • 安裝gradle

          • 導入項目

          • 編譯工程(順序:core->xom->context->beans->aspects->aop)

          • 編譯方法:工程->tasks->compileTestJava

          • 編譯完成后,新建一個測試module,用gradle的方式,build.gradle為:

          group?'org.springframework'
          version?'5.1.21.BUILD-SNAPSHOT'

          apply?plugin:?'java'

          sourceCompatibility?=?1.8

          repositories?{
          ????mavenCentral()
          }

          dependencies?{
          ????compile(project(":spring-context"))
          ????testCompile?group:?'junit',?name:?'junit',?version:?'4.12'
          }

          如果運行報錯,需要設置IDEA。
          需要將Preferences > Build, Execution, Deployment > Build Tools > Gradle > Runner里的 Delegate IDE build/run actions to gradle勾選上。


          Spring IOC容器初始化的關鍵環(huán)節(jié)就在AbstractApplicationContext的refresh方法中。

          public?void?refresh()?throws?BeansException,?IllegalStateException?{
          ??synchronized?(this.startupShutdownMonitor)?{
          ???//第一步:刷新前的預處理
          ???prepareRefresh();

          ???//?第二步:獲取BeanFactory;加載BeanDefition并注冊到BeanDefitionRegistry
          ???ConfigurableListableBeanFactory?beanFactory?=?obtainFreshBeanFactory();

          ???//?第三步:BeanFactory的預準備工作
          ???prepareBeanFactory(beanFactory);

          ???try?{
          ????//?第四步:BeanFactory準備工作完成之后進行的后置處理
          ????postProcessBeanFactory(beanFactory);

          ????//?第五步:實例化并調用實現(xiàn)了BeanFactoryPostProcessor接口的Bean
          ????invokeBeanFactoryPostProcessors(beanFactory);

          ????//?第六步:注冊BeanPostProcessor,在創(chuàng)建bean的前后等執(zhí)行。
          ????registerBeanPostProcessors(beanFactory);

          ????//?第七步:初始化MessageSource組件(做國際化功能;消息綁定,消息解析)
          ????initMessageSource();

          ????//?第八步:初始化事件派發(fā)器
          ????initApplicationEventMulticaster();

          ????//第九步:提供給子類重寫,容器刷新的適合可以自定義邏輯
          ????onRefresh();

          ????//?第十步:注冊應用監(jiān)聽器。就是注冊實現(xiàn)了ApplicationListener接口的監(jiān)聽器bean
          ????registerListeners();

          ????//?第十一步:初始化所有剩下的非懶加載的單例bean,
          ????//填充屬性
          ????//初始化方法調用
          ????//調用BeanPostProcessor對bean進行后置處理
          ????finishBeanFactoryInitialization(beanFactory);

          ????//?第十二步:完成context的刷新。主要是調用LifecycleProcessor的onRefresh方法,并且發(fā)布ContextRefreshedEvent事件
          ????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();
          ???}
          ??}
          ?}

          接下來我們分析第二步中的兩個子流程:

          2.1. 獲取BeanFactory子流程

          時序圖如下:

          2.2. BeanDefinition加載解析及注冊?流程

          BeanDefinition加載流程入口在AbstractRefreshableApplicationContext#refreshBeanFactory ?法中,會調用到loadBeanDefinitions方法,這個方法最終會由XmlBeanDefinitionReader的loadBeanDefinitions方法來完成。然后會調用它自己的doLoadBeanDefinitions方法。

          protected?int?doLoadBeanDefinitions(InputSource?inputSource,?Resource?resource)
          ???throws?BeanDefinitionStoreException?{

          ??try?{
          ???//讀取xml信息,將xml信息保存到Document中
          ???Document?doc?=?doLoadDocument(inputSource,?resource);
          ???//解析doc,封裝到BeanDefinition對象并進行注冊
          ???int?count?=?registerBeanDefinitions(doc,?resource);
          ???if?(logger.isDebugEnabled())?{
          ????logger.debug("Loaded?"?+?count?+?"?bean?definitions?from?"?+?resource);
          ???}
          ???return?count;
          ??}
          ?//省略部分代碼....

          繼續(xù)跟蹤registerBeanDefinitions方法。

          public?int?registerBeanDefinitions(Document?doc,?Resource?resource)?throws?BeanDefinitionStoreException?{
          ??BeanDefinitionDocumentReader?documentReader?=?createBeanDefinitionDocumentReader();
          ??//獲取已有的BeanDefinition的數(shù)量
          ??int?countBefore?=?getRegistry().getBeanDefinitionCount();
          ??//注冊BeanDefinitions
          ??documentReader.registerBeanDefinitions(doc,?createReaderContext(resource));
          ??//返回新注冊的BeanDefinition的數(shù)量
          ??return?getRegistry().getBeanDefinitionCount()?-?countBefore;
          ?}

          它又交由documentReader來執(zhí)行registerBeanDefinitions方法。documentReader接收后調用本類的doRegisterBeanDefinitions來執(zhí)行。這個方法里我們需要關注parseBeanDefinitions.preProcessXml和postProcessXml都是留給子類實現(xiàn)的。

          protected?void?doRegisterBeanDefinitions(Element?root)?{
          ?????//省略部分代碼...
          ??preProcessXml(root);
          ??parseBeanDefinitions(root,?this.delegate);
          ??postProcessXml(root);

          ??this.delegate?=?parent;
          ?}

          跟蹤parseBeanDefinitions方法,可以看到由DefaultBeanDefinitionDocumentReader#parseDefaultElement在進行解析

          private?void?parseDefaultElement(Element?ele,?BeanDefinitionParserDelegate?delegate)?{
          ??//import處理
          ??if?(delegate.nodeNameEquals(ele,?IMPORT_ELEMENT))?{
          ???importBeanDefinitionResource(ele);
          ??}
          ??//alias處理
          ??else?if?(delegate.nodeNameEquals(ele,?ALIAS_ELEMENT))?{
          ???processAliasRegistration(ele);
          ??}
          ??//解析bean元素
          ??else?if?(delegate.nodeNameEquals(ele,?BEAN_ELEMENT))?{
          ???processBeanDefinition(ele,?delegate);
          ??}
          ??//嵌套bean處理
          ??else?if?(delegate.nodeNameEquals(ele,?NESTED_BEANS_ELEMENT))?{
          ???//?recurse
          ???doRegisterBeanDefinitions(ele);
          ??}
          ?}

          最后跟蹤processBeanDefinition的代碼

          protected?void?processBeanDefinition(Element?ele,?BeanDefinitionParserDelegate?delegate)?{
          ??//解析bean元素為BeanDefinition,但是此時使用BeanDefinitionHolder又包裝了一層
          ??BeanDefinitionHolder?bdHolder?=?delegate.parseBeanDefinitionElement(ele);
          ??if?(bdHolder?!=?null)?{
          ???bdHolder?=?delegate.decorateBeanDefinitionIfRequired(ele,?bdHolder);
          ???try?{
          ????//?完成BeanDefinition的注冊
          ????BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder,?getReaderContext().getRegistry());
          ???}
          ???catch?(BeanDefinitionStoreException?ex)?{
          ????getReaderContext().error("Failed?to?register?bean?definition?with?name?'"?+
          ??????bdHolder.getBeanName()?+?"'",?ele,?ex);
          ???}
          ???//?Send?registration?event.
          ???getReaderContext().fireComponentRegistered(new?BeanComponentDefinition(bdHolder));
          ??}
          ?}

          到這里就完成了BeanDefinition的注冊。我們發(fā)現(xiàn),所謂的注冊就是把 XML 中定義的Bean信息封裝為BeanDefinition對象之后放??個Map中。

          this.beanDefinitionMap.put(beanName,?beanDefinition);

          簡略的時序圖如下:

          接下來我們分析一下Bean創(chuàng)建的流程。Bean創(chuàng)建是在refresh主流程中的第十一步里面。

          11.1 Bean創(chuàng)建子流程

          我們進入finishBeanFactoryInitialization方法。

          protected?void?finishBeanFactoryInitialization(ConfigurableListableBeanFactory?beanFactory)?{
          ??//省略部分代碼...
          ??String[]?weaverAwareNames?=?beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class,?false,?false);
          ??for?(String?weaverAwareName?:?weaverAwareNames)?{
          ???getBean(weaverAwareName);
          ??}

          ??//?Stop?using?the?temporary?ClassLoader?for?type?matching.
          ??beanFactory.setTempClassLoader(null);

          ??//?Allow?for?caching?all?bean?definition?metadata,?not?expecting?further?changes.
          ??beanFactory.freezeConfiguration();

          ??//?實例化所有非懶加載的bean
          ??beanFactory.preInstantiateSingletons();
          ?}

          跟蹤preInstantiateSingletons方法

          public?void?preInstantiateSingletons()?throws?BeansException?{
          ??if?(logger.isTraceEnabled())?{
          ???logger.trace("Pre-instantiating?singletons?in?"?+?this);
          ??}

          ??//?Iterate?over?a?copy?to?allow?for?init?methods?which?in?turn?register?new?bean?definitions.
          ??//?While?this?may?not?be?part?of?the?regular?factory?bootstrap,?it?does?otherwise?work?fine.
          ??List?beanNames?=?new?ArrayList<>(this.beanDefinitionNames);

          ??//?遍歷所有的beanName
          ??for?(String?beanName?:?beanNames)?{
          ???RootBeanDefinition?bd?=?getMergedLocalBeanDefinition(beanName);
          ???if?(!bd.isAbstract()?&&?bd.isSingleton()?&&?!bd.isLazyInit())?{
          ????//如果是工廠bean,即實現(xiàn)了FactoryBean接口
          ????if?(isFactoryBean(beanName))?{
          ?????Object?bean?=?getBean(FACTORY_BEAN_PREFIX?+?beanName);
          ?????if?(bean?instanceof?FactoryBean)?{
          ??????FactoryBean?factory?=?(FactoryBean)?bean;
          ??????boolean?isEagerInit;
          ??????if?(System.getSecurityManager()?!=?null?&&?factory?instanceof?SmartFactoryBean)?{
          ???????isEagerInit?=?AccessController.doPrivileged(
          ?????????(PrivilegedAction)?((SmartFactoryBean)?factory)::isEagerInit,
          ?????????getAccessControlContext());
          ??????}
          ??????else?{
          ???????isEagerInit?=?(factory?instanceof?SmartFactoryBean?&&
          ?????????((SmartFactoryBean)?factory).isEagerInit());
          ??????}
          ??????if?(isEagerInit)?{
          ???????getBean(beanName);
          ??????}
          ?????}
          ????}
          ????else?{
          ?????//實例化當前bean
          ?????getBean(beanName);
          ????}
          ???}
          ??}
          ????//省略...
          ?}

          我們發(fā)現(xiàn)不管是工廠Bean,還是普通Bean都會調用getBean(beanName);方法。然后調用到doGetBean方法。

          protected??T?doGetBean(
          ???String?name,?@Nullable?Class?requiredType,?@Nullable?Object[]?args,?boolean?typeCheckOnly)
          ???throws?BeansException?{

          ??String?beanName?=?transformedBeanName(name);
          ??Object?bean;

          ??//?從緩存中拿
          ??Object?sharedInstance?=?getSingleton(beanName);
          ??if?(sharedInstance?!=?null?&&?args?==?null)?{
          ???if?(logger.isTraceEnabled())?{
          ????if?(isSingletonCurrentlyInCreation(beanName))?{
          ?????logger.trace("Returning?eagerly?cached?instance?of?singleton?bean?'"?+?beanName?+
          ???????"'?that?is?not?fully?initialized?yet?-?a?consequence?of?a?circular?reference");
          ????}
          ????else?{
          ?????logger.trace("Returning?cached?instance?of?singleton?bean?'"?+?beanName?+?"'");
          ????}
          ???}
          ???bean?=?getObjectForBeanInstance(sharedInstance,?name,?beanName,?null);
          ??}

          ??else?{
          ???//如果已經(jīng)有創(chuàng)建過程中的同beanName的bean,拋異常
          ???if?(isPrototypeCurrentlyInCreation(beanName))?{
          ????throw?new?BeanCurrentlyInCreationException(beanName);
          ???}

          ???//?從parentBeanFactory里找對應的bean
          ???BeanFactory?parentBeanFactory?=?getParentBeanFactory();
          ???if?(parentBeanFactory?!=?null?&&?!containsBeanDefinition(beanName))?{
          ????//?Not?found?->?check?parent.
          ????String?nameToLookup?=?originalBeanName(name);
          ????if?(parentBeanFactory?instanceof?AbstractBeanFactory)?{
          ?????return?((AbstractBeanFactory)?parentBeanFactory).doGetBean(
          ???????nameToLookup,?requiredType,?args,?typeCheckOnly);
          ????}
          ????else?if?(args?!=?null)?{
          ?????//?Delegation?to?parent?with?explicit?args.
          ?????return?(T)?parentBeanFactory.getBean(nameToLookup,?args);
          ????}
          ????else?if?(requiredType?!=?null)?{
          ?????//?No?args?->?delegate?to?standard?getBean?method.
          ?????return?parentBeanFactory.getBean(nameToLookup,?requiredType);
          ????}
          ????else?{
          ?????return?(T)?parentBeanFactory.getBean(nameToLookup);
          ????}
          ???}

          ???if?(!typeCheckOnly)?{
          ????//打一個已創(chuàng)建的標記
          ????markBeanAsCreated(beanName);
          ???}

          ???try?{
          ????RootBeanDefinition?mbd?=?getMergedLocalBeanDefinition(beanName);
          ????checkMergedBeanDefinition(mbd,?beanName,?args);

          ????//?保證當前bean所依賴的bean的初始化
          ????String[]?dependsOn?=?mbd.getDependsOn();
          ????if?(dependsOn?!=?null)?{
          ?????for?(String?dep?:?dependsOn)?{
          ??????if?(isDependent(beanName,?dep))?{
          ???????throw?new?BeanCreationException(mbd.getResourceDescription(),?beanName,
          ?????????"Circular?depends-on?relationship?between?'"?+?beanName?+?"'?and?'"?+?dep?+?"'");
          ??????}
          ??????registerDependentBean(dep,?beanName);
          ??????try?{
          ???????getBean(dep);
          ??????}
          ??????catch?(NoSuchBeanDefinitionException?ex)?{
          ???????throw?new?BeanCreationException(mbd.getResourceDescription(),?beanName,
          ?????????"'"?+?beanName?+?"'?depends?on?missing?bean?'"?+?dep?+?"'",?ex);
          ??????}
          ?????}
          ????}

          ????//創(chuàng)建bean
          ????//?單例bean
          ????if?(mbd.isSingleton())?{
          ?????sharedInstance?=?getSingleton(beanName,?()?->?{
          ??????try?{
          ???????//具體的創(chuàng)建bean邏輯
          ???????return?createBean(beanName,?mbd,?args);
          ??????}
          ??????catch?(BeansException?ex)?{
          ???????//?Explicitly?remove?instance?from?singleton?cache:?It?might?have?been?put?there
          ???????//?eagerly?by?the?creation?process,?to?allow?for?circular?reference?resolution.
          ???????//?Also?remove?any?beans?that?received?a?temporary?reference?to?the?bean.
          ???????destroySingleton(beanName);
          ???????throw?ex;
          ??????}
          ?????});
          ?????bean?=?getObjectForBeanInstance(sharedInstance,?name,?beanName,?mbd);
          ????}
          ????//多例bean
          ????else?if?(mbd.isPrototype())?{
          ?????//?It's?a?prototype?->?create?a?new?instance.
          ?????Object?prototypeInstance?=?null;
          ?????try?{
          ??????beforePrototypeCreation(beanName);
          ??????prototypeInstance?=?createBean(beanName,?mbd,?args);
          ?????}
          ?????finally?{
          ??????afterPrototypeCreation(beanName);
          ?????}
          ?????bean?=?getObjectForBeanInstance(prototypeInstance,?name,?beanName,?mbd);
          ????}

          ????else?{
          ?????String?scopeName?=?mbd.getScope();
          ?????if?(!StringUtils.hasLength(scopeName))?{
          ??????throw?new?IllegalStateException("No?scope?name?defined?for?bean?′"?+?beanName?+?"'
          ");
          ?????}
          ?????Scope?scope?=?this.scopes.get(scopeName);
          ?????if?(scope?==?null)?{
          ??????throw?new?IllegalStateException("
          No?Scope?registered?for?scope?name?'"?+?scopeName?+?"'");
          ?????}
          ?????try?{
          ??????Object?scopedInstance?=?scope.get(beanName,?()?->?{
          ???????beforePrototypeCreation(beanName);
          ???????try?{
          ????????return?createBean(beanName,?mbd,?args);
          ???????}
          ???????finally?{
          ????????afterPrototypeCreation(beanName);
          ???????}
          ??????});
          ??????bean?=?getObjectForBeanInstance(scopedInstance,?name,?beanName,?mbd);
          ?????}
          ?????catch?(IllegalStateException?ex)?{
          ??????throw?new?BeanCreationException(beanName,
          ????????"
          Scope?'"?+?scopeName?+?"'?is?not?active?for?the?current?thread;?consider?"?+
          ????????"
          defining?a?scoped?proxy?for?this?bean?if?you?intend?to?refer?to?it?from?a?singleton",
          ????????ex);
          ?????}
          ????}
          ???}
          ???catch?(BeansException?ex)?{
          ????cleanupAfterBeanCreationFailure(beanName);
          ????throw?ex;
          ???}
          ??}

          ??//?檢查所需類型是否與實際bean實例的類型匹配。
          ??if?(requiredType?!=?null?&&?!requiredType.isInstance(bean))?{
          ???try?{
          ????T?convertedBean?=?getTypeConverter().convertIfNecessary(bean,?requiredType);
          ????if?(convertedBean?==?null)?{
          ?????throw?new?BeanNotOfRequiredTypeException(name,?requiredType,?bean.getClass());
          ????}
          ????return?convertedBean;
          ???}
          ???catch?(TypeMismatchException?ex)?{
          ????if?(logger.isTraceEnabled())?{
          ?????logger.trace("
          Failed?to?convert?bean?'"?+?name?+?"'?to?required?type?'"?+
          ???????ClassUtils.getQualifiedName(requiredType)?+?"'
          ",?ex);
          ????}
          ????throw?new?BeanNotOfRequiredTypeException(name,?requiredType,?bean.getClass());
          ???}
          ??}
          ??return?(T)?bean;
          ?}

          可以看到經(jīng)過一些判斷和校驗,會調createBean方法去創(chuàng)建bean,然后調用doCreateBean去完成創(chuàng)建。

          protected?Object?doCreateBean(String?beanName,?RootBeanDefinition?mbd,?@Nullable?Object[]?args)
          ???throws?BeanCreationException?{

          ??//?Instantiate?the?bean.
          ??BeanWrapper?instanceWrapper?=?null;
          ??if?(mbd.isSingleton())?{
          ???instanceWrapper?=?this.factoryBeanInstanceCache.remove(beanName);
          ??}
          ??if?(instanceWrapper?==?null)?{
          ???//創(chuàng)建bean實例,但是尚未設置屬性
          ???instanceWrapper?=?createBeanInstance(beanName,?mbd,?args);
          ??}
          ??Object?bean?=?instanceWrapper.getWrappedInstance();
          ??Class?beanType?=?instanceWrapper.getWrappedClass();
          ??if?(beanType?!=?NullBean.class)?{
          ???mbd.resolvedTargetType?=?beanType;
          ??}

          ??//允許后處理器修改合并的bean定義
          ??synchronized?(mbd.postProcessingLock)?{
          ???if?(!mbd.postProcessed)?{
          ????try?{
          ?????applyMergedBeanDefinitionPostProcessors(mbd,?beanType,?beanName);
          ????}
          ????catch?(Throwable?ex)?{
          ?????throw?new?BeanCreationException(mbd.getResourceDescription(),?beanName,
          ???????"Post-processing?of?merged?bean?definition?failed",?ex);
          ????}
          ????mbd.postProcessed?=?true;
          ???}
          ??}

          ??//急切地緩存單例,以便能夠解析循環(huán)引用
          ??//即使由BeanFactoryAware等生命周期接口觸發(fā)。
          ??boolean?earlySingletonExposure?=?(mbd.isSingleton()?&&?this.allowCircularReferences?&&
          ????isSingletonCurrentlyInCreation(beanName));
          ??if?(earlySingletonExposure)?{
          ???if?(logger.isTraceEnabled())?{
          ????logger.trace("Eagerly?caching?bean?'"?+?beanName?+
          ??????"'?to?allow?for?resolving?potential?circular?references");
          ???}
          ???addSingletonFactory(beanName,?()?->?getEarlyBeanReference(beanName,?mbd,?bean));
          ??}

          ??//?Initialize?the?bean?instance.
          ??Object?exposedObject?=?bean;
          ??try?{
          ???//設置屬性
          ???populateBean(beanName,?mbd,?instanceWrapper);
          ???//應用初始化方法,調用BeanPostProcessor后置處理器
          ???exposedObject?=?initializeBean(beanName,?exposedObject,?mbd);
          ??}
          ??catch?(Throwable?ex)?{
          ???if?(ex?instanceof?BeanCreationException?&&?beanName.equals(((BeanCreationException)?ex).getBeanName()))?{
          ????throw?(BeanCreationException)?ex;
          ???}
          ???else?{
          ????throw?new?BeanCreationException(
          ??????mbd.getResourceDescription(),?beanName,?"Initialization?of?bean?failed",?ex);
          ???}
          ??}

          ??if?(earlySingletonExposure)?{
          ???Object?earlySingletonReference?=?getSingleton(beanName,?false);
          ???if?(earlySingletonReference?!=?null)?{
          ????if?(exposedObject?==?bean)?{
          ?????exposedObject?=?earlySingletonReference;
          ????}
          ????else?if?(!this.allowRawInjectionDespiteWrapping?&&?hasDependentBean(beanName))?{
          ?????String[]?dependentBeans?=?getDependentBeans(beanName);
          ?????Set?actualDependentBeans?=?new?LinkedHashSet<>(dependentBeans.length);
          ?????for?(String?dependentBean?:?dependentBeans)?{
          ??????if?(!removeSingletonIfCreatedForTypeCheckOnly(dependentBean))?{
          ???????actualDependentBeans.add(dependentBean);
          ??????}
          ?????}
          ?????if?(!actualDependentBeans.isEmpty())?{
          ??????throw?new?BeanCurrentlyInCreationException(beanName,
          ????????"Bean?with?name?'"?+?beanName?+?"'?has?been?injected?into?other?beans?["?+
          ????????StringUtils.collectionToCommaDelimitedString(actualDependentBeans)?+
          ????????"]?in?its?raw?version?as?part?of?a?circular?reference,?but?has?eventually?been?"?+
          ????????"wrapped.?This?means?that?said?other?beans?do?not?use?the?final?version?of?the?"?+
          ????????"bean.?This?is?often?the?result?of?over-eager?type?matching?-?consider?using?"?+
          ????????"'getBeanNamesForType'?with?the?'allowEagerInit'?flag?turned?off,?for?example.");
          ?????}
          ????}
          ???}
          ??}

          ??//?Register?bean?as?disposable.
          ??try?{
          ???registerDisposableBeanIfNecessary(beanName,?bean,?mbd);
          ??}
          ??catch?(BeanDefinitionValidationException?ex)?{
          ???throw?new?BeanCreationException(
          ?????mbd.getResourceDescription(),?beanName,?"Invalid?destruction?signature",?ex);
          ??}

          ??return?exposedObject;
          ?}

          在上述的方法中會先實例化一個bean,然后注入property里面配置的屬性,最后執(zhí)行初始化相關方法。

          簡單時序圖:




          ? 作者?|??女友在高考

          來源 |??cnblogs.com/javammc/p/15562424.html


          加鋒哥微信:?java3459??
          圍觀鋒哥朋友圈,每天推送Java干貨!

          瀏覽 92
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码欧美成人18XXXXX日本 | 国产操网 | 插一插色一色撸一撸视频在线 | 九九大香蕉视频 | 一级特黄录像免费播放下载软件 |