最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring bean 加載執(zhí)行順序實例解析

 更新時間:2018年02月05日 15:39:20   作者:firu  
這篇文章主要介紹了Spring bean 加載執(zhí)行順序實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Spring bean 加載執(zhí)行順序的相關內容,具體如下。

問題來源:

有一個bean為A,一個bean為B。想要A在容器實例化的時候的一個屬性name賦值為B的一個方法funB的返回值。

如果只是在A里單純的寫著:

private B b;
private String name = b.funb();

會報錯說nullpointException,因為這個時候b還沒被set進來,所以為null。

解決辦法為如下代碼,同時學習下spring中 InitializingBean ,對象構造方法 , init-method 的執(zhí)行順序。

public class A implements InitializingBean {
	private B b;
	private String name;
	// = b.funb(); 
	public void setB(B b) {
		System.out.println("A.setB initialed");
		this.b = b;
	}
	public A() {
		System.out.println("A initialed");
	}
	public void init() {
		System.out.println("init");
		this.name = b.funb();
	}
	@Override 
	 public String toString() {
		return super.toString() + this.name;
	}
	public void afterPropertiesSet() throws Exception {
		//其實放在這里也可以 
		//this.name = b.funb(); 
		System.out.println("afterPropertiesSet");
	}
}
public class B {
	public String funb() {
		System.out.println("funb");
		return "B.funb";
	}
	public B() {
		System.out.println("B initialed");
	}
}

spring配置文件

<beans default-autowire="byName">
   <bean id="a" class="testspring.A" init-method="init">
   </bean>
   <bean id="b" class="testspring.B">
   </bean>
 </beans>

測試代碼:

public static void main(String[] args) {
	ApplicationContext context = new FileSystemXmlApplicationContext(
	     "src/testspring/bean.xml");
	A a = (A) context.getBean("a");
	System.out.println(a);
}

程序輸出為:

A initialed
B initialed
A.setB initialed
afterPropertiesSet
init
funb
testspring.A@50d89cB.funb

從這里看到A的name屬性在bean加載完成的時候也被成功設置為B的funB方法的返回值了,要點就是用init-method來實現(xiàn)。

加載順序也可以看到為:

先構造函數(shù)——>然后是b的set方法注入——>InitializingBean 的afterPropertiesSet方法——>init-method方法

總結為:

以下內容是從書中摘錄來的,但是我發(fā)現(xiàn)即使摘錄一遍,對其內容的理解也會更加深入!

一、Spring裝配Bean的過程

1. 實例化;
2. 設置屬性值;
3. 如果實現(xiàn)了BeanNameAware接口,調用setBeanName設置Bean的ID或者Name;
4. 如果實現(xiàn)BeanFactoryAware接口,調用setBeanFactory 設置BeanFactory;
5. 如果實現(xiàn)ApplicationContextAware,調用setApplicationContext設置ApplicationContext
6. 調用BeanPostProcessor的預先初始化方法;
7. 調用InitializingBean的afterPropertiesSet()方法;
8. 調用定制init-method方法;
9. 調用BeanPostProcessor的后初始化方法;

Spring容器關閉過程

1. 調用DisposableBean的destroy();
2. 調用定制的destroy-method方法;

一、單一Bean

裝載

1. 實例化;
2. 設置屬性值;
3. 如果實現(xiàn)了BeanNameAware接口,調用setBeanName設置Bean的ID或者Name;
4. 如果實現(xiàn)BeanFactoryAware接口,調用setBeanFactory 設置BeanFactory;
5. 如果實現(xiàn)ApplicationContextAware,調用setApplicationContext設置ApplicationContext
6. 調用BeanPostProcessor的預先初始化方法;
7. 調用InitializingBean的afterPropertiesSet()方法;
8. 調用定制init-method方法;
9. 調用BeanPostProcessor的后初始化方法;

spring容器關閉

1. 調用DisposableBean的destroy();
2. 調用定制的destroy-method方法;

二、多個Bean的先后順序

優(yōu)先加載BeanPostProcessor的實現(xiàn)Bean
按Bean文件和Bean的定義順序按bean的裝載順序(即使加載多個spring文件時存在id覆蓋)
“設置屬性值”(第2步)時,遇到ref,則在“實例化”(第1步)之后先加載ref的id對應的bean
AbstractFactoryBean的子類,在第6步之后,會調用createInstance方法,之后會調用getObjectType方法
BeanFactoryUtils類也會改變Bean的加載順序

總結

以上就是本文關于Spring bean 加載執(zhí)行順序實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • 基于Spring-AOP實現(xiàn)自定義分片工具詳解

    基于Spring-AOP實現(xiàn)自定義分片工具詳解

    隨著數(shù)據(jù)量的增長,在與其他系統(tǒng)交互時,批量接口會出現(xiàn)超時現(xiàn)象,發(fā)現(xiàn)原批量接口在實現(xiàn)時,沒有做分片處理。由于與其他系統(tǒng)交互比較多,一個一個接口去做分片優(yōu)化,改動量較大,所以考慮通過AOP解決此問題,感興趣的可以了解一下
    2022-11-11
  • MyBatis-Plus動態(tài)返回實體類示例詳解

    MyBatis-Plus動態(tài)返回實體類示例詳解

    這篇文章主要為大家介紹了MyBatis-Plus動態(tài)返回實體類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Java?數(shù)據(jù)結構與算法系列精講之漢諾塔

    Java?數(shù)據(jù)結構與算法系列精講之漢諾塔

    漢諾塔是源于印度一個古老傳說的益智玩具。大梵天創(chuàng)造世界時做了三根石柱,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,三根柱子之間一次只能移動一個圓盤
    2022-02-02
  • Java中Spring WebSocket詳解

    Java中Spring WebSocket詳解

    本篇文章主要通過代碼給大家詳細分析了Java中Spring WebSocket的用法,需要的讀者們參考學習下吧。
    2017-12-12
  • IDEA+Maven打JAR包的兩種方法步驟詳解

    IDEA+Maven打JAR包的兩種方法步驟詳解

    Idea中為一般的非Web項目打Jar包是有自己的方法的,下面這篇文章主要給大家介紹了關于IDEA+Maven打JAR包的兩種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Java合并兩個及以上有序鏈表的示例詳解

    Java合并兩個及以上有序鏈表的示例詳解

    這篇文章主要通過兩個例題為大家介紹一下Java合并兩個及以上有序鏈表的實現(xiàn)方法,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下
    2022-11-11
  • Java設計模式之狀態(tài)模式詳解

    Java設計模式之狀態(tài)模式詳解

    Java?中的狀態(tài)模式(State?Pattern)是一種行為型設計模式,它允許對象在內部狀態(tài)發(fā)生改變時改變其行為,本文將詳細介紹?Java?中的狀態(tài)模式,我們將從狀態(tài)模式的概述、結構與實現(xiàn)、優(yōu)缺點、適用場景等方面進行講解,需要的朋友可以參考下
    2023-05-05
  • JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    這篇文章主要給大家介紹了關于JDK安裝與配置(包含二個或多個JDK的同時安裝)的相關資料,對于Java學習者來說,一臺電腦拿到手肯定要配置JDK,但是對于新手來說還是容易出錯,需要的朋友可以參考下
    2023-10-10
  • springboot讀取bootstrap配置及knife4j版本兼容性問題及解決

    springboot讀取bootstrap配置及knife4j版本兼容性問題及解決

    這篇文章主要介紹了springboot讀取bootstrap配置及knife4j版本兼容性問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 關于Jedis的用法以及Jedis使用Redis事務

    關于Jedis的用法以及Jedis使用Redis事務

    這篇文章主要介紹了關于Jedis的用法以及Jedis使用Redis事務問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

临沧市| 宜都市| 循化| 临高县| 金塔县| 泗水县| 克东县| 南木林县| 嘉黎县| 萍乡市| 成安县| 郎溪县| 凌云县| 柞水县| 霸州市| 通榆县| 宁国市| 赤城县| 米泉市| 利辛县| 高清| 偏关县| 商洛市| 丹棱县| 内黄县| 怀来县| 布拖县| 双城市| 怀柔区| 仙游县| 伊金霍洛旗| 营口市| 名山县| 昌江| 汕尾市| 阿鲁科尔沁旗| 阿拉善左旗| 扶绥县| 大埔区| 镶黄旗| 博白县|