Spring IOC 應用 (1)管理物件
一,搭建Spring IOC開發環境
1,引入相關jar包(IOC jar包)
2,在src新增applicationContext.xml
二,建立物件
1,在applicationContext.xml中加入<beans>父標籤和<bean>子標籤,我們將在該XML檔案中定義(與原來直接在類中用Calendar c=new GregorianCalender();不同,以下方法更適用於大專案的物件建立):
<!-- 採用 new GregorianCalendar() 構造方法--> <bean id="c1" class="java.util.GregorianCalendar"></bean>
<!-- 採用 Calendar.getInstance() 靜態方法-->
<bean id="c2" class="java.util.Calendar" factory-method="getInstance"></bean>
<!-- 採用 C2.getTime()方法 物件工廠方法-->
<bean id="date" factory-bean="c2" factory-method="getTime"></bean>
2,在main方法中,需要建立application容器,來獲取物件:
//建立application容器
String conf= "applicationContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(conf);
//從Spring容器獲取c1
Calendar c1=ac.getBean("c1",Calendar.class);
Calendar c2=ac.getBean("c2",Calendar.class); Date d1=ac.getBean("date", Date.class); //使用通過輸出到控制檯來檢測效果 System.out.println(c1); System.out.println(c2); System.out.println(d1);
三,初始化和銷燬物件,釋放容器
1.在applicationContext.xml中的bean標籤內新增屬性 init-method和destroy-method
<!-- 範圍一般預設是單例 singleton lazy-init true是為了不讓他在建立spring容器的時候就初始化建構函式和初始化函式-->
<bean id="m1" scope="singleton" lazy-init="true" class="Package1.Mymessage" init-method="init" destroy-method="mydestory" ></bean>
2,在類方法中
public void init(){
System.out.println("我是init!");
}
public void mydestory(){
System.out.println("我是destory!");
}
public void Mymessage(){
System.out.println("我是結構函式");
}
public void fly(){
System.out.println("我可以飛起來");
}
3.釋放spring容器,在main類中
AbstractApplicationContext ac1=new ClassPathXmlApplicationContext(conf);
ApplicationContext ac2=new ClassPathXmlApplicationContext(conf);
Mymessage m1=ac.getBean("m1", Mymessage.class);
m1.fly();
//ac2.close();會報錯
ac1.close();//需要在ApplicationContext 前面加上Abstract
補充知識:spring bean作用域有以下5個:
singleton:單例模式,當spring建立applicationContext容器的時候,spring會欲初始化所有的該作用域例項,加上lazy-init就可以避免預處理;
單例的目的:保證一個類只有單一的例項,也就是說你無法通過new來建立這個類的一個新例項。
單例的好處:當一個物件在程式內部只能有一個例項的時候,它可以保證我們不會重複建立,而是始終指向同一個物件。
Singleton通過將構造方法限定為private避免了類在外部被例項化,在同一個虛擬機器範圍內,Singleton的唯一例項只能通過getInstance()方法訪問。
prototype:原型模式,每次通過getBean獲取該bean就會新產生一個例項,建立後spring將不再對其管理;====下面是在web專案下才用到的===
request:搞web的大家都應該明白request的域了吧,就是每次請求都新產生一個例項,和prototype不同就是建立後,接下來的管理,spring依然在監聽
session:每次會話,同上
global session:全域性的web域,類似於servlet中的application