廢話兩 句,以前也看過Spring in action,那時候只能草草的看看,沒有仔細閱讀,如今在讀Spring in action 是想發奮圖強,幾個月后就要結婚了,也許會在今年會要寶寶,為了給寶寶一個更好的生活環境,為了做一個好爸爸,我從現在開始努力的工作,努力的學習,我想 在博客園中留下我的奮斗足跡,同時也鞭策自己,不要放棄自己的初衷。
--2013-03-18 劉帥 寫於南京
----------------------------以上內容純屬戰前動-------------------------
文章導讀:
Spring框架的核心是Spring Container,Spring有多種Spring Container的實現,但歸根結底分為兩類:
1.BeanFactory創建最簡單的Spring Container提供最基本的DI(Dependency Injection)和bean-wiring服務.
2.ApplicationContext創建的SpringContainer提供更多的高級框架服務.
在這篇文章中和以后的文章中,我會把主要的精力放在ApplicationContext創建的SpringContainer上,在以后的文章中不在贅述.
Wiring Beans
1.首先創建一個玩家接口方便后面使用.
public interface Player { public void play(); }
2.創建一個Dota玩家類,繼承自玩家類
public class DotaPlayer implements Player { //已殺敵人總數 private int currentKill = 0; //沒有參數的構造方法 public DotaPlayer(){}
//以基本類型為參數的構造方法 public DotaPlayer(int currentKill){ this.currentKill = currentKill; }; //重寫Player類中的play()方法 @Override public void play() { // TODO Auto-generated method stub System.out.println("DOTA玩家已經殺了"+ this.currentKill +"個敵人."); } }
3.類創建好了,下面用Spring配置文件來配置這個類,為實例化這個類做准備.
<bean id="dotaPlayer" class="com.ricky.zero.pojo.DotaPlayer"></bean>
其中com.ricky.zero.pojo是創建DotaPlayer的包名,DotaPlayer是類名,到這里Spring Configuration已經配置完成,下面讓我們來實例化這個DotaPlayer玩家類.
4.實例化DotaPlayer類.
public class DITest { //用Spring的DI(依賴注入)實例化第一個Pojo類. @Test public void DITest1(){ //當Spring container 加載Spring配置文件后,<beans></beans>標簽下的所有<bean></bean>將會被實例化. ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); DotaPlayer dotaPlayer = (DotaPlayer)ctx.getBean("dotaPlayer"); dotaPlayer.play(); } }
5.運行Test后結果如下:
DOTA玩家已經殺了0個敵人.
說明DotaPlayer類已經被實例化成功.到此,恭喜你完成了學習Spring的第一步,實例化一個Pojo類.
1.其實在上文中,我已經在使用構造器來實例化類了,在上文的DotaPlayer類中,我創建了兩個構造方法,一個是沒有參數的構造方法,一個是 有參數的構造方法,在注入DotaPlayer對象中默認調用了它的無參構造方法,若刪除上文的無參構造方法,只保留有參的構造方法則會拋以下的異常:
Could not instantiate bean class [com.ricky.zero.pojo.DotaPlayer]: No default constructor found.
所有在重寫構造方法的時候一定記得寫一個無參的構造方法.
2.當然,我在DotaPlayer類中創建兩個構造方法是有原因的,也許有人已經想到了,那現在就來看,Spring如何通過有參構造方法來注入Pojo對象.
3.已經寫到的類和接口不用做任何改變,只需要將Spring的Configuration的作如下修改:
<bean id="dotaPlayer" class="com.ricky.zero.pojo.DotaPlayer"> <constructor-arg value="10"></constructor-arg> </bean>
<constructor-arg value="10"></constructor-arg>元素的作用是給構造器的傳遞參數,若沒有該元素,Spring Container將會調用默認的構造器,若沒有默認的構造器則會
拋上述異常.
4.修改完成后,運行結果若如下:
DOTA玩家已經殺了10個敵人.
則證明成功的使用有參數的構造方法注入Pojo對象.
5.在上述步驟里,成功的使用了有參和無參的構造器注入了Pojo對象,在有參構造器中,我給構造器的參數是基本類型的,下面將用構造器來注入一個Pojo對象.
首先我們創建一個Game接口,方便下面使用.
public interface Game { //獲取游戲名稱 public void getGameName(); }
創建一個魔獸爭霸游戲類,類名War3繼承自Game接口.
public class War3 implements Game { @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我的名字叫魔獸爭霸,相信你們很多人都已經認識我了."); } }
6.在上述基礎上修改兩處,在DotaPlayer類中添加一個構造方法,如下:
//以對象類型為參數的構造方法 public DotaPlayer(War3 war3){ this.war3 = war3; };
在play()方法中,調用War3對象的getGameName()方法.如下:
//重寫Player類中的play()方法 @Override public void play() { // TODO Auto-generated method stub System.out.println("DOTA玩家已經殺了"+ this.currentKill +"個敵人."); war3.getGameName(); }
在Spring的configuration中修改如下:
<bean id="war3" class="com.ricky.zero.pojo.War3"></bean> <bean id="dotaPlayer" class="com.ricky.zero.pojo.DotaPlayer"> <constructor-arg ref="war3"></constructor-arg> </bean>
第一個<bean id="war3" class="com.ricky.zero.pojo.War3"></bean>使用Spring中無參構造方法注入Pojo類,然后把已經實例化的對象作為dotaPlayer
bean的構造參數,注入到構造方法中.至此完成了用構造方法來注入對象.
7.讓我們來檢驗用構造方法注入對象是否成功,若結果如下,則注入成功.
DOTA玩家已經殺了0個敵人.
大家好,我的名字叫魔獸爭霸,相信你們很多人都已經認識我了.
------------------------------明天預告----------------------------
到此,用構造方法來注入有參或者無參的Pojo類就結束了,由於明天還要上班,今天就分享到這,明天我們講分享Bean的Scope、
init-method 、destory-method以及如何使用setter方法來注入基本類型和Pojo類.
--------------------------------申明----------------------------
本文可以免費閱讀以及轉載,轉載時請注明出處.
本人郵箱:Ricky_LS@163.com
Thank you for your corporation.