熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring的自動裝配

2013-11-23 20:34:44  來源: Java開源技術 

  采用構造函數注入以及setter方法注入都需要寫大量的XML配置文件這時可以采用另一種方式就是自動裝由Spring來給我們自動裝配我們的Bean

  Spring提供了四種自動裝配類型

  :ByName 采用這種方式時給屬性自動注入值時會根據Bean裡的setXXX中的XXX去搜尋有沒有id=XXX的Bean有的話將其自動注入沒有的話就表示setXXX裡要裝入屬性沒有裝配值

  :ByType 采用這種方式給屬性自動注入值時會根據Bean裡的setXXX中的參數類型來搜尋配置文件中的Bean定義如果發現了一個就自動將其注入否則如果有個這個屬性沒有被裝配如果有多個則會拋出異常

  :constructor 這種方式的注入與ByType其實沒什麼區別無非是將ByType移入到了構造函數中這種方式下構造函數是自動注入的在構造對象時會自動根據構造函數的參數類型搜尋Bean如果有一個合適的則成功一個沒有則失敗有多個則會拋出異常

  :autodetect 自動檢測方式會采用如下流程先按照constructor方式再按照ByType方式

  例子源代碼如下

  例子一個Java工程師從一個網站上買東本

  一個普通的JavaBean

  [java]

  interface Engineer{

  Object buyApple();

  }

  public class JavaEngineer implements Engineer{

  private String name;

  private Website ws;

  public JavaEngineer(String name){

  thisname=name;

  }

  public void setWebsite(Website ws){

  thisws=ws;

  }

  @Override

  public String toString() {

  // TODO Autogenerated method stub

  return supertoString();

  }

  public Object buyApple(){

  Systemoutprint(工程師+name);

  return wsbuyApple();

  }

  }

  interface Engineer{

  Object buyApple();

  }

  public class JavaEngineer implements Engineer{

  private String name;

  private Website ws;

  public JavaEngineer(String name){

  thisname=name;

  }

  public void setWebsite(Website ws){

  thisws=ws;

  }

  @Override

  public String toString() {

  // TODO Autogenerated method stub

  return supertoString();

  }

  public Object buyApple(){

  Systemoutprint(工程師+name);

  return wsbuyApple();

  }

  }

  這個網站假設是淘寶網

  [java]

  interface Website{

  Object buyApple();

  }

  public class TaobaoWebsite implements Website {

  public TaobaoWebsite()

  {

  }

  public Object buyApple()

  {

  Systemoutprintln(購買了一個蘋果);

  return new Object();

  }

  }

  interface Website{

  Object buyApple();

  }

  public class TaobaoWebsite implements Website {

  public TaobaoWebsite()

  {

  }

  public Object buyApple()

  {

  Systemoutprintln(購買了一個蘋果);

  return new Object();

  }

  }則采用自動裝配的ByName方式的配置文件如下

  [java]

  <?xml version= encoding=UTF?>

  <beans

  xmlns=/schema/beans

  xmlns:xsi=//XMLSchemainstance

  xmlns:p=/schema/p

  xsi:schemaLocation=/schema/beans /schema/beans/springbeansxsd>

  <! 這個名字要和setXXX中的XXX保持一致不區分大小寫 >

  <bean id=website class=comppTaobaoWebsite/>

  <bean id=engineer class=comppJavaEngineer autowire=byName>

  <constructorarg value=ppTest/>

  <! 這裡有一個屬性采用的是自動byName的方式注入的 >

  </bean>

  </beans>

  <?xml version= encoding=UTF?>

  <beans

  xmlns=/schema/beans

  xmlns:xsi=//XMLSchemainstance

  xmlns:p=/schema/p

  xsi:schemaLocation=/schema/beans /schema/beans/springbeansxsd>

  <! 這個名字要和setXXX中的XXX保持一致不區分大小寫 >

  <bean id=website class=comppTaobaoWebsite/>

  <bean id=engineer class=comppJavaEngineer autowire=byName>

  <constructorarg value=ppTest/>

  <! 這裡有一個屬性采用的是自動byName的方式注入的 >

  </bean>

  </beans>打印結果如下

  [java]

  工程師ppTest購買了一個蘋果

  工程師ppTest購買了一個蘋果

  有了第一個結果後第二個結果也就很簡單了

  ByType的測試

  修改配置文件如下

  [html]

  <! 這個名字 不再需要和setXXX中的XXX保持一致>

  <bean id=web class=comppTaobaoWebsite/>

  <bean id=engineer class=comppJavaEngineer autowire=byType>

  <constructorarg value=ppTest/>

  <! 這裡有一個屬性采用的是自動byName的方式注入的 >

  </bean>

  <! 這個名字 不再需要和setXXX中的XXX保持一致>

  <bean id=web class=comppTaobaoWebsite/>

  <bean id=engineer class=comppJavaEngineer autowire=byType>

  <constructorarg value=ppTest/>

  <! 這裡有一個屬性采用的是自動byName的方式注入的 >

  </bean>其他的地方可以不用修改

  Constructor自動裝配為了測試給JavaEngineer加入一個構造函數如下方式

  [java]

  public JavaEngineer(Website ws){

  thisws=ws;

  thisname=ppTest;

  }

  public JavaEngineer(Website ws){

  thisws=ws;

  thisname=ppTest;

  }

  再修改配置文件如下

  [html]

  <bean id=web class=comppTaobaoWebsite/>

  <bean id=engineer class=comppJavaEngineer autowire=constructor>

  <!<constructorarg value=ppTest/>>

  <! 這裡有一個屬性采用的是自動byName的方式注入的 >

  </bean>

  <bean id=web class=comppTaobaoWebsite/>

  <bean id=engineer class=comppJavaEngineer autowire=constructor>

  <!<constructorarg value=ppTest/>>

  <! 這裡有一個屬性采用的是自動byName的方式注入的 >

  </bean>結果是一樣的

  自動裝配autodetect通過將autowire設置為autodetect是指示Spring容器讓它先嘗試使用constructor自動裝配如果沒有找到合適的Bean就嘗試使用ByType自動裝配新版本中好象已經沒有這個屬性了


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28710.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.