spring預設情況下,所有的spring bean均是單一的,當在spring中宣告時,有宣告
bean範圍的選項,為了使得每次都能產生乙個新的bean例項,可以給bean填加乙個屬性
scope=prototype
利用工廠方法建立bean(這是個設計模式)
單例類(設計模式中的單鍵模式),其實就是把建構函式設為私有方法,以致於在類的外部沒有辦法來呼叫建構函式構造物件,獲取物件的唯一方式就是通過類的靜態方法。
spring中要想實現徹徹底底的單例模式,必須要為類提供乙個靜態方法,同時也需要bean的相關屬性支援,bean屬性中有乙個配置元素factory-method,就是用來指定要構造出類的物件需要呼叫的靜態方法例子(關鍵**):
//乙個建構函式
private person(string s_name, setset, mapmap,
listmeal)
private static class sigletonperson
static public person getinstance()
//預設的建構函式
private person()
配置檔案如下:
進行測試如下:
beanfactory factory=new xmlbeanfactory(new classpathresource("person.xml"));
person person=(person)factory.getbean("person");
system.out.println(person.getname());
person.setname("小華");
person p1=(person)factory.getbean("person");
system.out.println(person.getname());//說明是同乙個物件
person p2=person.getinstance();
system.out.println(p2.getname());//說明是同乙個物件
最後的結果如下:
小明小華
小華
當例項化bean時,有必要執行一些初始化來使它處於可用的狀態,在清除bean時,也需要執行些清除工作,為了支援這種特性,spring中為bean提供了以下兩個配置選項,init-method以及destroy-method.
上面的建構函式**中,我們只是對名字進行了賦值,而其他屬性卻沒有賦值,如meal,map.set等,現在讓看看使用init-method方法來保證當物件構造成功後處於乙個正確的狀態。
//乙個建構函式
private person(string s_name, setset, mapmap,
listmeal)
private void init()
配置檔案如下:
測試檔案如下:
beanfactory factory=new xmlbeanfactory(new classpathresource("person.xml"));
person person=(person)factory.getbean("person");
system.out.println(person.getname());
person.setname("小華");
person.getmap().put(14, "高中");
system.out.println(person.getmap());
system.out.println();
//從下面這個列印結果可以看出,對於單例類,初始化方法在每次獲取物件時都會呼叫,
//操作的是同乙個物件,對這個物件再次呼叫init方法,因此上面的結果均被部刷掉
person p1=(person)factory.getbean("person");
system.out.println(person.getname());//說明是同乙個物件
system.out.println(person.getmap());
person p2=person.getinstance();
system.out.println(p2.getname());//說明是同乙個物件
system.out.println(p2.getmap());
destroy-method方法和上面的init-method類似,只是乙個在執行建構函式後呼叫,乙個是在執行物件銷毀前呼叫。 Spring控制Bean載入順序
spring容器載入bean順序是不確定的,spring框架沒有約定特定順序邏輯規範。首先要了解depends on或 dependson作用,是用來表示乙個bean a的例項化依賴另乙個bean b的例項化,但是a並不需要持有乙個b的物件,如果需要的話就不用depends on,直接用依賴注入就可...
Spring中Bean的配置
以下面的xml檔案舉例 第乙個bean的名稱為role,第二個bean的名稱為medicine,第三個bean的名稱為spring.chapter.mary.poison,第四個bean的名稱為spring.chapter.mary.poison 1 id和name的區別如下 id屬性具有唯一性,每...
spring中bean的建立
問題 1 bean 的建立時機 bean 是在什麼時候被建立的,有哪些規則?容器初始化的時候會預先對單例和非延遲載入的物件進行預先初始化。其他的都是延遲載入是在第一次呼叫getbean 的時候被建立。從 defaultlistablebeanfactory 的 preinstantiatesingl...