Spring中bean的範圍:
在Spring容器中,bean的範圍範圍預設是單例模式的,singleton,單例模式可以由多個線程並發訪問,如果
我們想改變bean的範圍範圍,將其改變為多例模式,即每次從容器中擷取相同的bean時,都是新的bean,而不
是獲得兩次相同的bean,其記憶體位址相同,為true。那麼在設定檔中設定bean的範圍範圍,Spring容器通過
scope="prototype"來將bean的範圍設定為多例模式。如下:
<bean id="userDAO" class="com.aptech.dao.impl.UserDAOImpl" scope="prototype"></bean>
Spring容器初始化相關問題:
在Spring容器中,預設情況下,容器啟動時初始化所有容器中的bean,但是我們可以指定bean節點的lazy-
init="true"來延遲初始化bean,這時只有在擷取該bean時,才會初始化bean。如:
<bean id="userDAO" class="com.aptech.dao.impl.UserDAOImpl" lazy-init="true"></bean>
如果想對所有Spring容器中的bean都應用延遲初始化,可以在根節點<beans/>設定default-lazy-
init="true".如下:
<beans default-lazy-init="true" />
在Spring中,當bean的範圍範圍是預設的單例模式時,bean會在Spring容器啟動時就初始化,如果bean的範圍範圍是多例模式的,bean的初始化是在調用該bean的執行個體時,由beanfactory初始化。如果想在容器啟動時,延遲單例模式bean的初始化,則應該按照上一點的方法。
如果想在bean被初始化的同時,讓bean所對應的類的相應方法執行,比如:調用該類的初始化方法,或者開啟某一資料庫連接等,應該怎麼辦呢。在bean節點中為我們提供了init-method屬性,該屬性用來指定bean初始化時
,同時該bean所對應的類的某一方法同時執行,該屬性的值是對應類中的某一方法。如下:<bean id="userDAO"
class="com.aptech.dao.impl.UserDAOImpl" init-method="getConn"></bean>
當然,如果我們想在gaibean銷毀時,也同時執行gaibean對應類的某一方法,Spring也提供了一個屬性:
destroy-method,該方法將在bean被銷毀之前調用,該屬性的值也是對應類的某一方法,如:
<bean id="userDAO" class="com.aptech.dao.impl.UserDAOImpl" destroy-method="closeAll"></bean>
怎樣測試bean在容器啟動時是否初始化。因為大多數bean的建立都是通過類構造器來執行個體化的,所以在bean對應的類中的建構函式中輸出一句話,之後建立一個Spring容器,看是否輸出構造方法中的話,如果輸出則證明在
Sping容器啟動時bean就初始化了,如果沒有輸出則……
思考:bean什麼時候被銷毀呢。 在Spring容器關閉的時候被銷毀。
那怎樣關閉Spring容器呢。使用一個抽象類別AbstractApplicationContext ,如下:
AbstractApplicationContext context = new ClassPathXmlApplicationContext
("applicationContext.xml");
// 關閉Spring容器
context.close();