一、bean被創建的時間 考慮一個問題,我們都知道spring通過xml的配置創建bean,那麼bean是什麼時間被創建的呢?是在我們getBean()的時候創建的嗎? 我們來做一個測試: 1.首先建立一個User類: package com.jms.pojo; public class User ...
一、bean被創建的時間
考慮一個問題,我們都知道spring通過xml的配置創建bean,那麼bean是什麼時間被創建的呢?是在我們getBean()的時候創建的嗎?
我們來做一個測試:
1.首先建立一個User類:
package com.jms.pojo; public class User { private String name; public User() { System.out.println("User被創建了"); } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } }
我們在User的無參構造中加入了一個列印語句,當User被創建時就會列印出“User被創建了”。
2.然後對應的一個xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="com.jms.pojo.User"> <property name="name" value="jms"/> </bean> </beans>
3.一個測試
@Test public void userTest() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); }
這個測試只有創建容器這一行代碼。
測試結果:
由上可以看出,即使我們沒有使用bean,bean也在創建容器的時候就被創建並且存放在了容器之中;還可以看出,創建bean的方式預設是調用無參構造。
二、IoC創建對象的方式
1.預設:通過無參構造進行創建
2.通過有參構造創建
雖然預設是通過無參構造進行創建,我們能不能通過有參構造進行創建呢?答案是可以的。
我們還是先來做個測試,用一個有參構造覆蓋無參構造:
package com.jms.pojo; public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } }
此時xml文件會報錯:
那麼如何在xml中配置有參構造呢?
官方給出了三種方法:
(1)通過類型進行配置
<bean id="user" class="com.jms.pojo.User"> <constructor-arg type="java.lang.String" value="jms"/> </bean>
這種配置方法並不適用於有相同類型的情況,所以不建議用。
(2)通過索引進行配置
<bean id="user" class="com.jms.pojo.User"> <constructor-arg index="0" value="jms"/> </bean>
索引從0開始依次遞增,由於我這裡只有一個參數,所以只有一個0.
(3)通過參數名進行配置
<bean id="user" class="com.jms.pojo.User"> <constructor-arg name="name" value="jms"/> </bean>
這種方法應該是最簡單明瞭的。
還有一種特殊情況就是傳入的參數也是一個bean,這種情況官方同樣給出瞭解決的方案:
package x.y; public class ThingOne { public ThingOne(ThingTwo thingTwo, ThingThree thingThree) { // ... } }
<beans> <bean id="beanOne" class="x.y.ThingOne"> <constructor-arg ref="beanTwo"/> <constructor-arg ref="beanThree"/> </bean> <bean id="beanTwo" class="x.y.ThingTwo"/> <bean id="beanThree" class="x.y.ThingThree"/> </beans>
(本文僅作個人學習記錄用,如有紕漏敬請指正)