系统学习Spring之Spring in action(二)
每日一叨:
非常抱歉,由于剛剛接觸博客園,很多功能都還沒有怎么熟悉,所以第一篇文章的排版不夠好,一些重要的信息不夠醒目,在接下來的文章里,我會有所改善,
若有哪個地方理解的有問題,可以與我交流,我會即時更正.
文章導讀:
1.Factory-Method(指定構造方法)
2.BeanScope(Bean的生命周期)
3.Init-Method與Destory-Method(初始Bean與銷毀Bean)
4.通過Bean標簽中的<properties></properties>標簽注入基本類型和對象類型
?
知識點:
在上一篇文章中,學習了如何用構造方法去注入對象,當注入對象的時候調用哪一個構造方法是被動的取決與構造參數,若構造參數為空,則調用默認的
構造器,若不為空,則調用構造方法的參數類型與傳遞過來的參數類型相對應的構造方法.除了這種被動式的通過構造方法來注入對象,是否可以手動指
定一個普通靜態方法,使其完成對象的注入呢?
?
1.Factory-Method(指定構造方法)
在學習指定構造方法之前,我想都應該知道什么是單例吧,為了保險起見,我還是先說一下什么是單例吧.
單例:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點.
下面即將使用指定構造方法完成一個單例Demo.
首先創建一個Ricky類:
public class Ricky {//懶漢式單例類.在第一次調用的時候實例化 //私有的默認構造方法,也就是無法使用new運算符來創建一個對象private Ricky() {}//創建一個靜態對象.也就是我啦,Name:劉帥 Age:24private static Ricky single=null;//靜態工廠方法 public synchronized static Ricky getInstance() {if (single == null) { single = new Ricky();} return single;} }配置Spring的configuration文件:
<bean id="ricky" class="com.ricky.zero.pojo.Ricky" factory-method="getInstance"></bean>當注入Ricky對象的時候,不在去調用Ricky類的構造方法,而是直接調用指定好的getInstance方法,該方法是一個普通的靜態方法.
測試單例模型能否成功
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Ricky ricky1 = (Ricky)ctx.getBean("ricky");Ricky ricky2 = (Ricky)ctx.getBean("ricky");if(ricky1==ricky2){System.out.println("兩個對象是同一個對象");}else{System.out.println("兩個對象不是同一個對象");}運行后若得到:
兩個對象是同一個對象,則表明測試成功.
2.BeanScope(Bean的生命周期)
Spring中Bean的生命周期有五種,分別是singleton,prototype,request,session,global-session.最常用的是singleton和prototype.
Spring中Bean的默認生命周期是singleton.
通過這個圖,我想比我的敘述要直觀的多.還是講下最常用的兩個生命周期,singleton,prototype.
singleton:是Bean的默認生命周期,在每個Spring Container中,只定義了一個實現(俗稱單例).
prototype:允許Bean實例化無數次.(每實例第一次,它會new出一個全新的對象)
做一個簡單的演示:
首先創建一個狗的對象:
public class Dog{//狗的名字private String dogName;//狗的年齡private int dogAge;//省略getter和setter }先演示,singleton生命周期,其實我們一直都在使用,以前是隱式定義,這次我們顯示的定義bean的生命周期.
<bean id="dog" class="com.ricky.zero.pojo.Dog" scope="singleton"></bean>測試:
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Dog dog1 = (Dog)ctx.getBean("dog");Dog dog2 = (Dog)ctx.getBean("dog");if(dog1==dog2){System.out.println("你說的兩條狗是同一條狗.");}else{System.out.println("你說的兩條狗不是同一條狗.");}測試結果:你說的兩條狗是同一條狗.
由上可證,當Bean的生命周期是singleton的時候,無論你注入多少個對象,它們都是同一個對象,因為在同一個Spring container中,生命周期為singleton的
對象是單例.
演示prototype:只需要修改Spring configuration配置即可,修改如下:
<bean id="dog" class="com.ricky.zero.pojo.Dog" scope="prototype"></bean>運行測試:無需修改,直接運行.
測試結果:你說的兩條狗不是同一條狗.
通過測試結果,可以看出,當Bean的生命周期是prototype的時候,每當你注入一個對象的時候,它都會重新new一個全新的對象出來.
在Spring Scope到這里就結束了,如果想繼續了解下面3種生命周期可以去查閱Spring官方的文檔.
?
3.Init-Method與Destory-Method(初始化Bean與銷毀Bean)
Spring container中bean的init-method屬性是用于在加載bean之前調用init-method指定的方法,而destory-method是用于在銷毀bean之前調用
指定的方法.
演示:
public class Computer {//將會在加載computer Bean之前調用.public void turnOnComputer(){System.out.println("電腦正在啟動,請稍候...");}//將會在清除computer Bean之前調用 public void turnOffComputer(){System.out.println("電腦正在關閉中,請稍候...");} }修改Spring configuration配置文件,修改如下:
<bean id="computer" class="com.ricky.zero.pojo.Computer" init-method="turnOnComputer" destroy-method="turnOffComputer"></bean>測試運行:
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");測試結果:
電腦正在啟動,請稍候...
由于bean不要在用完后立即清除,導致沒能看到destory-method的結果,當bean被清除的時候,它會調用destory-method的.
除了可以指定bean的init-method和destory-method,我們還可以指定,Spring Container的默認init-method和destory-method,
方法如下:直接在<beans>default-init-method="初始方法名" default-destroy-method="銷毀方法名"></beans>
?
?
4.通過Bean標簽中的<properties></properties>標簽注入基本類型和對象類型
Spring可以通過configuration配置文件中properties標簽中的value值注入到setter屬性的參數列表中,value的值既可以是基本類型,
也可以是對象類型.
演示:
創建一個Game接口,方便下面使用.
?
public interface Game {//獲取游戲名稱public void getGameName(); }?
創建一個Dota類,繼承之Game,類中有兩個私有的屬性.
一個是String類型,一個是War3類型.
下面將通過Spring Configuration 中properties標簽向setter方法中注入,String類型的值和War3類型的值.
?
?
public class Dota implements Game {//Dota游戲作者private String author;//Dota玩家同樣會玩War3private War3 war3; public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public War3 getWar3() {return war3;}public void setWar3(War3 war3) {this.war3 = war3;}@Overridepublic void getGameName() {// TODO Auto-generated method stubSystem.out.println("大家好,我們名字叫Dota,來自 " + this.author + " 之手");this.war3.getGameName();} }?
配置Spring Configuration:
<bean id="war3" class="com.ricky.zero.pojo.War3"></bean><bean id="dota" class="com.ricky.zero.pojo.Dota"><property name="author" value="冰蛙"></property><property name="war3" ref="war3"></property></bean>首先實例化一個war3對象,在dota這個bean中使用了兩個properties標簽,其實這個標簽的name屬性是要注入setter參數列表的參數名,若是基本類型可以
直接通過value屬性把值傳遞到setter參數列表中的參數里.若是對象類型則可以使用ref屬性,ref屬性的值是bean的ID.對象類型中String除外,String也是
可以直接通過value直接注入的.因為Spring的value類型都是以字符傳遞值,然后識別解析到對應的類型的參數列表中.
?
運行測試:
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Dota dota = (Dota)ctx.getBean("dota");dota.getGameName();測試結果:
大家好,我們名字叫Dota,來自 冰蛙 之手
大家好,我的名字叫魔獸爭霸,相信你們很多人都已經認識我了.
若結果如上,說明通過properties注入普通類型和對象類型成功.
?
?
--------------------------------申明----------------------------
本文可以免費閱讀以及轉載,轉載時請注明出處.
本人郵箱:Ricky_LS@163.com
Thank you for your corporation.
?
?
?
轉載于:https://www.cnblogs.com/yjhk/archive/2013/03/20/2970351.html
總結
以上是生活随笔為你收集整理的系统学习Spring之Spring in action(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PGA Usage Larger tha
- 下一篇: dell服务器系统开机提示错误解决方法