国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring高手之路-SpringBean的生命周期

這篇具有很好參考價(jià)值的文章主要介紹了Spring高手之路-SpringBean的生命周期。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

SpringBean的生命周期

整體介紹

詳細(xì)介紹

1.實(shí)例化Bean

2.設(shè)置屬性值

3.檢查Aware

4.調(diào)用BeanPostProcessor的前置處理方法

5.調(diào)用InitializingBean的afterPropertiesSet方法

6.調(diào)用自定義init-method方法

7.調(diào)用BeanPostProcessor的后置處理方法

8.注冊Destruction回調(diào)

9.Bean準(zhǔn)備就緒

10.調(diào)用DisposableBean的destroy方法

11.調(diào)用自定義的destory-method

核心部分源碼


SpringBean的生命周期

整體介紹

一個(gè)SpringBean從出生到銷毀的全過程就是它的整個(gè)生命周期,需要經(jīng)歷以下幾個(gè)階段:

Spring高手之路-SpringBean的生命周期,spring高手之路,java,spring

整個(gè)生命周期可以大致分為三個(gè)大階段,分別是:創(chuàng)建、使用、銷毀。還可以進(jìn)一步分為5個(gè)小的階段:實(shí)例化、初始化(前置處理、初始化、后置處理)、注冊Destruction回調(diào)、正常使用、銷毀。

詳細(xì)介紹

SpringBean的生命周期詳情

1.實(shí)例化Bean

Spring容器首先創(chuàng)建Bean實(shí)例

AbstractAutowireCapableBeanFactory類中的createBeanInstance方法中實(shí)現(xiàn)

2.設(shè)置屬性值

Spring容器注入必要的屬性到Bean中。

AbstractAutowireCapableBeanFactory類中的populateBean方法中處理

3.檢查Aware

如果Bean實(shí)現(xiàn)了BeanNameAware、BeanClassLoaderAware等這些Aware接口,Spring容器會調(diào)用它們。

?在AbstractAutowireCapableBeanFactory類中的initializeBean方法中調(diào)用

4.調(diào)用BeanPostProcessor的前置處理方法

在Bean初始化之前,允許自定義的BeanPostProcessor對Bean實(shí)例進(jìn)行處理,如修改Bea的狀態(tài)

BeanPostProcessor的postProcessBeforeInitialization方法會在此時(shí)被調(diào)用。

AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsBeforeInitialization方法執(zhí)行

5.調(diào)用InitializingBean的afterPropertiesSet方法

提供一個(gè)機(jī)會,在所有Bean屬性設(shè)置完成后進(jìn)行初始化操作。如果Bean實(shí)現(xiàn)了InitializingBean接口afterPropertiesSet方法會被調(diào)用。
AbstractAutowireCapableBeanFactory的invokelnitMethods方法中調(diào)用

6.調(diào)用自定義init-method方法

提供一種配置方式,在XML配置中指定Bean的初始化方法。如果Bean在配置文件中定義了初始化方法那么該方法會被調(diào)用。
AbstractAutowireCapableBeanFactory的invokelnitMethods方法中調(diào)用

7.調(diào)用BeanPostProcessor的后置處理方法

在Bean初始化之后,再次允許BeanPostProcessor對Bean進(jìn)行處理。BeanPostProcessor的postProcessAfterlnitialization方法會在此時(shí)被調(diào)用。

AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterlnitialization方法執(zhí)行

8.注冊Destruction回調(diào)

如果Bean實(shí)現(xiàn)了DisposableBean接口或在Bean定義中指定了自定義的銷毀方法,Spring容器會為這些Bean注冊一個(gè)銷毀回調(diào),確保在容器關(guān)閉時(shí)能夠正確地清理資源。

AbstractAutowireCapableBeanFactory類中的registerDisposableBeanlfNecessary方法中實(shí)現(xiàn)

9.Bean準(zhǔn)備就緒

此時(shí),Bean已完全初始化,可以開始處理應(yīng)用程序的請求了

10.調(diào)用DisposableBean的destroy方法

當(dāng)容器關(guān)閉時(shí),如果Bean實(shí)現(xiàn)了DisposableBean接口,destroy方法會被調(diào)用。

DisposableBeanAdapter的destroy方法中實(shí)現(xiàn)

11.調(diào)用自定義的destory-method

如果Bean在配置文件中定義了銷毀方法,那么該方法會被調(diào)用


DisposableBeanAdapter的destroy方法中實(shí)現(xiàn)

核心部分源碼

可以看到,整Bean的創(chuàng)建的過程都依賴于AbstractAutowireCapableBeanFactory這個(gè)類,而銷毀主要依賴DisposableBeanAdapter這個(gè)類


AbstractAutowireCapableBeanFactory 的入口處,doCreateBean的核心代碼如下,其中包含了實(shí)例化、設(shè)置屬性值、初始化Bean以及注冊銷毀回調(diào)的幾個(gè)核心方法。

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

		//實(shí)例化 Bean。
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		Object bean = instanceWrapper.getWrappedInstance();
		Class<?> beanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {
			mbd.resolvedTargetType = beanType;
		}


		//..............................................



		//初始化 Bean 實(shí)例。
		Object exposedObject = bean;
		try {
               //設(shè)置屬性值
			populateBean(beanName, mbd, instanceWrapper);
              //初始化Bean
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}


		//......................................



		//注冊Bean的銷毀回調(diào)。
		try {
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}

??而DisposableBeanAdapter的destory方法的核心內(nèi)容如下文章來源地址http://www.zghlxwxcb.cn/news/detail-770083.html

@Override
	public void destroy() {

		//...........................


		if (this.invokeDisposableBean) {


			//........................


			try {
				((DisposableBean) this.bean).destroy();
			}

			//.............................

		
        
        //判斷是否自定義了銷毀方法
		else if (this.destroyMethods != null) {
            //遍歷每個(gè)銷毀方法并調(diào)用
			for (Method destroyMethod : this.destroyMethods) {
				invokeCustomDestroyMethod(destroyMethod);
			}
		}
		else if (this.destroyMethodNames != null) {
            //遍歷每個(gè)銷毀方法名稱并通過方法名稱調(diào)用
			for (String destroyMethodName : this.destroyMethodNames) {
				Method destroyMethod = determineDestroyMethod(destroyMethodName);
				if (destroyMethod != null) {
					invokeCustomDestroyMethod(
							ClassUtils.getInterfaceMethodIfPossible(destroyMethod, this.bean.getClass()));
				}
			}
		}
	}

到了這里,關(guān)于Spring高手之路-SpringBean的生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring高手之路-Spring在業(yè)務(wù)中常見的使用方式

    目錄 通過IOC實(shí)現(xiàn)策略模式 通過AOP實(shí)現(xiàn)攔截增強(qiáng) 1.參數(shù)檢驗(yàn) 2.緩存邏輯 3.日志記錄 通過Event異步解耦 通過Spring管理事務(wù) 1.聲明式事務(wù) 2.編程式事務(wù) 3.需要注意的問題 不能在事務(wù)中處理分布式緩存 不能在事務(wù)中執(zhí)行 RPC 操作 不過度使用聲明式事務(wù) 很多時(shí)候,我們需要對不同的

    2024年01月19日
    瀏覽(22)
  • Spring高手之路9——掌握Spring條件裝配的秘密武器

    Spring高手之路9——掌握Spring條件裝配的秘密武器

    ??在 Spring 框架中,條件裝配( Conditional Configuration )是一個(gè)非常重要的特性,它允許開發(fā)者根據(jù)滿足的條件,動態(tài)地進(jìn)行 Bean 的注冊或是創(chuàng)建。這樣就可以根據(jù)不同的環(huán)境或配置,創(chuàng)建不同的 Bean 實(shí)例,這一特性對于創(chuàng)建可配置和模塊化的應(yīng)用是非常有用的。 Spring 提供了一

    2024年02月16日
    瀏覽(23)
  • Spring高手之路10——解鎖Spring組件掃描的新視角

    Spring高手之路10——解鎖Spring組件掃描的新視角

    ??首先,我們將探討一些 Spring 框架中 IOC ( Inversion of Control )的高級特性,特別是組件掃描的相關(guān)知識。組件掃描是 Spring 框架中一個(gè)重要的特性,它可以自動檢測并實(shí)例化帶有特定注解(如 @Component , @Service , @Controller 等)的類,并將它們注冊為 Spring 上下文中的 bean 。這

    2024年02月16日
    瀏覽(26)
  • Spring高手之路8——Spring Bean模塊裝配的藝術(shù):@Import詳解

    Spring高手之路8——Spring Bean模塊裝配的藝術(shù):@Import詳解

    ??在 Spring 中,手動裝配通常是指通過 XML 配置文件明確指定 Bean 及其依賴,或者在代碼中直接使用 new 創(chuàng)建對象并設(shè)定依賴關(guān)系。 ??然而,隨著 Spring 2.0 引入注解,以及 Spring 3.0 全面支持注解驅(qū)動開發(fā),這個(gè)過程變得更加自動化。例如,通過使用 @Component + @Compo

    2024年02月13日
    瀏覽(26)
  • Spring高手之路3——揭秘Spring依賴注入和SpEL表達(dá)式

    Spring高手之路3——揭秘Spring依賴注入和SpEL表達(dá)式

    本篇會給大家舉出各種 Spring 屬性依賴注入的例子,方便大家理解。 我們在前面的文章中已經(jīng)使用過 XML 進(jìn)行 setter 方法的屬性注入了,下面讓我們再來回顧一下: 我們在前面的文章中也學(xué)習(xí)過如何在 bean 創(chuàng)建時(shí)通過編程方式設(shè)置屬性: 使用XML進(jìn)行setter方法注入 首先,我們需

    2024年02月08日
    瀏覽(33)
  • 【Spring】——Spring生命周期

    【Spring】——Spring生命周期

    ??????Spring專欄更新中,各位大佬覺得寫得不錯(cuò),支持一下,感謝了!?????? Spring_冷兮雪的博客-CSDN博客 前面我們講完了Spring中有關(guān)Bean的讀和取,我們還沒有好好去了解了解Bean對象,這篇 就是對Bean的深入學(xué)習(xí)。 限定程序中變量的可用范圍叫做作用域,或者說

    2024年02月08日
    瀏覽(21)
  • Spring高手之路15——掌握Spring事件監(jiān)聽器的內(nèi)部邏輯與實(shí)現(xiàn)

    Spring高手之路15——掌握Spring事件監(jiān)聽器的內(nèi)部邏輯與實(shí)現(xiàn)

    在閱讀本文之前需要你已經(jīng)對事件監(jiān)聽器有了簡單的了解,或去閱讀前面的文章《 Spring高手之路7——事件機(jī)制與監(jiān)聽器的全面探索 》 ??在 Spring 中, ApplicationContext 可以形成一個(gè)層次結(jié)構(gòu),通常由主容器和多個(gè)子容器組成。一個(gè)常見的疑問是:當(dāng)一個(gè)事件在其中一個(gè)容器

    2024年02月06日
    瀏覽(29)
  • Spring高手之路11——BeanDefinition解密:構(gòu)建和管理Spring Beans的基石

    Spring高手之路11——BeanDefinition解密:構(gòu)建和管理Spring Beans的基石

    ?? BeanDefinition 是 Spring 中一個(gè)非常重要的概念,它包含了 Spring 容器用于創(chuàng)建、配置 Bean 所需的所有信息。理解 BeanDefinition 可以幫助我們深入掌握 Spring 的內(nèi)部工作機(jī)制。 首先,讓我們來對 BeanDefinition 有一個(gè)整體的認(rèn)識。 ??對于理解 Spring 框架的概念和組件, Spring 的官方

    2024年02月15日
    瀏覽(22)
  • Spring高手之路-@Autowired和@Resource注解異同點(diǎn)

    Spring高手之路-@Autowired和@Resource注解異同點(diǎn)

    目錄 概述 相同點(diǎn) 1.都可以實(shí)現(xiàn)依賴注入 2.都可以用于注入任意類型的Bean 3.都支持通過名稱、類型匹配進(jìn)行注入 不同點(diǎn) 1.來源不同。 2.包含的屬性不同 3.匹配方式(裝配順序)不同。 4.支持的注入對象類型不同 5.應(yīng)用地方不同 @Autowired 和 @Resource 是在 Java 開發(fā)中用于實(shí)現(xiàn)依賴

    2024年02月03日
    瀏覽(26)
  • Spring高手之路12——BeanDefinitionRegistry與BeanDefinition合并解析

    Spring高手之路12——BeanDefinitionRegistry與BeanDefinition合并解析

    ?? BeanDefinitionRegistry 是一個(gè)非常重要的接口,存在于 Spring 的 org.springframework.beans.factory.support 包中,它是 Spring 中注冊和管理 BeanDefinition 的核心組件。 ??讓我們回顧一下上一篇說的 BeanDefinition 。在 Spring 中,一個(gè) Bean 就是一個(gè)被 Spring 管理的對象,而一個(gè) BeanDefinition 則是

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包