spring加載bean實例化順序

問題來源:java

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

若是隻是在A裏單純的寫着:ide

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

會報錯說nullpointException,由於這個時候b還沒被set進來,因此爲null。函數

解決辦法爲以下代碼,同時學習下spring中 InitializingBean對象 構造方法init-method 的執行順序。學習

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->
      <bean id="a" class="testspring.A" init-method="init">
      </bean>
      <bean id="b" class="testspring.B">
      </bean>
 </beans>

測試代碼: this

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

 }

程序輸出爲:code

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

從這裏看到A的name屬性在bean加載完成的時候也被成功設置爲B的funB方法的返回值了,要點就是用init-method來實現。對象

加載順序也能夠看到爲:

先構造函數——>而後是b的set方法注入—— >InitializingBean 的afterPropertiesSet方法——>init- method方法

 

總結爲:

如下內容是從書中摘錄 來的,可是我發現即便摘錄一遍,對其內容的理解也會更加深刻!
1、Spring裝配Bean的過程 1. 實例化; 2. 設置屬性值; 3. 若是實現了BeanNameAware接口,調用setBeanName設置Bean的ID或者Name; 4. 若是實現BeanFactoryAware接口,調用setBeanFactory 設置BeanFactory; 5. 若是實現ApplicationContextAware,調用setApplicationContext設置ApplicationContext 6. 調用BeanPostProcessor的預先初始化方法; 7. 調用InitializingBean的afterPropertiesSet()方法; 8. 調用定製init-method方法; 9. 調用BeanPostProcessor的後初始化方法;

相關文章
相關標籤/搜索