問題來源: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的後初始化方法;