天天看點

Spring架構之DIspring的DI(依賴注入)

spring的DI(依賴注入)

    就是給bean對象的屬性指派。

1、  通過bean對象的屬性的set方法給此屬性進行指派(或參考:spring07_DI_set工程)

       被指派的屬性必須要有set方法。

       代碼示例:

           要被指派的對象

               //要被執行個體化的對象

              public class User implements Serializable {

              //基本類型

                  private Integer uid;

                  private String name;

              //引用類型

                  private Book book;

              //Set集合

                  private Set set;

              //Map集合

                  private Map map;

              //List集合

                  private List list;

              //Properties配置檔案格式

                  private Properties properties;

                  public Integer getUid() {

                     return uid;

                  }

                  public void setUid(Integer uid) {

                      this.uid = uid;

                  }

                  public String getName() {

                     return name;

                  }

                  public void setName(String name) {

                     this.name = name;

                  }

                  public Book getBook() {

                     return book;

                  }

                  public void setBook(Book book) {

                     this.book = book;

                  }

                  public Set getSet() {

                     return set;

                  }

                  public void setSet(Set set) {

                     this.set = set;

                  }

                  public Map getMap() {

                     return map;

                  }

                  public void setMap(Map map) {

                     this.map = map;

                  }

                  public List getList() {

                     return list;

                  }

                  public void setList(List list) {

                     this.list = list;

                  }

                  public Properties getProperties() {

                     return properties;

                  }

                  public void setProperties(Properties properties) {

                     this.properties = properties;

                  }

              }

           spring配置檔案

              <?xml version="1.0"encoding="UTF-8"?>

              <beans xmlns="http://www.springframework.org/schema/beans"

                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                  xsi:schemaLocation="http://www.springframework.org/schema/beans

                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

              <!-- 給bean對象的屬性進行初始化指派,用屬性的set方法-->

                  <!-- 注冊Book對象 -->

                  <bean id="bookObj"class="cn.domain.Book" scope="prototype"></bean>

                  <!-- 注冊User對象,并為此User對象的屬性進行初始化指派,調用的是此屬性的set方法進行賦的值 -->

                  <bean id="user"class="cn.domain.User">

                     <!-- 給uid屬性指派 -->

                     <property name="uid"value="1" />

                     <!-- 給name屬性指派 -->

                     <property name="name"value="張三" />

                     <!-- 給book引用類型變量指派 -->

                     <property name="book">

                         <!--bean引用的是以上Book對象的id屬性,表示建立一個以上的Book對象指派給此book屬性 -->

                         <ref bean="bookObj"/>

                     </property>

                     <!-- 給List集合指派 -->

                     <property name="list">

                         <list>

                            <!-- 向此list集合中存入“list内容1”字元串 -->

                            <value>list内容1</value>

                            <!-- 給此list集合中存入引用類型的對象 -->

                            <ref bean="bookObj"/>

                            <value>list内容2</value>

                         </list>

                     </property>

                     <!-- 給Set集合指派 -->

                     <property name="set">

                         <set>

                            <!-- 存入字元串“set内容1” -->

                            <value>set内容1</value>

                            <!-- 向此set集合中添加一個引用類型的對象 -->

                            <ref bean="bookObj"/>

                            <value>123</value>

                         </set>

                     </property>

                     <!-- 給Map集合指派 -->

                     <property name="map">

                         <map>

                            <!-- 一個entry标簽表示一個映射關系 -->

                            <entry key="key1">

                                <value>value1</value>

                            </entry>

                            <!-- 向map集合中存儲一個引用類型的對象 -->

                            <entry key="key2">

                                <ref bean="bookObj"/>

                            </entry>

                         </map>

                     </property>

                     <!-- 向Properties對象中注入映射關系(注意Properties對象的key和value必須是String類型的) -->

                     <property name="properties">

                         <props>

                            <!-- 向properties屬性對象中插入映射關系(一個prop标簽代表一個映射關系),此對象中的映射關系的值隻能是String類型的,是以沒有ref标簽 -->

                            <prop key="prop1">

                                prop内容1

                            </prop>

                            <prop key="prop2">

                                prop内容2

                            </prop>

                            <prop key="prop3">

                                prop内容3

                            </prop>

                         </props>

                     </property>

                  </bean>

                  <!--

                     從以上代碼中可以看出,如果給一個屬性或容器指派,隻要指派引用類型對象,就用ref标簽。如果指派基本類型的值,就直接用value标簽來指派(基本類型會自動轉換)。

                   -->

              </beans>

           測試代碼

              public class UserTest extends SpringInit{

                  //給bean對象的屬性進行初始化指派,用屬性的set方法

                  @Test

                  public void test(){

                     //獲的user對象

                     User user = (User)applicationContext.getBean("user");

                  //列印user中被初始化的值

                     System.out.println("uid="+user.getUid());

                     System.out.println("name="+user.getName());

                     System.out.println("book="+user.getBook());

                     //列印set屬性的值

                     System.out.println("set=");

                     for(Object obj : user.getSet()){

                         System.out.println("    "+obj);

                     }

                     //列印list屬性的值

                     System.out.println("list=");

                      for(Object obj : user.getList()){

                         System.out.println("    "+obj);

                     }

                     //列印map屬性的值

                     System.out.println("map=");

                     for(Entry ent : (Set<Entry>)user.getMap().entrySet()){

                         System.out.println("    "+ent.getKey()+":"+ent.getValue());

                      }

                     //列印properties屬性的值

                     System.out.println("properties=");

                     for(Entry ent : user.getProperties().entrySet()){

                         System.out.println("    "+ent.getKey()+":"+ent.getValue());

                     }

                  }

              }

2、  通過bean對象的構造函數給此對象的屬性初始化(或參考:spring08_DI_constructor工程)

       首先在Bean對象中建立帶參數的構造函數,然後在配置檔案中配置此陪的有參構造方法,那麼執行個體化此對象時調用的就是配置的有參的構造方法。

       代碼示例:     

           要被指派的對象

               //要被執行個體化的對象

              public class User implements Serializable {

              //基本類型

                  private String name;

              //引用類型

                  private Book book;

              //Map集合

                  private Map map;

                  //構造方法初始化name屬性和book屬性,及一個Map集合

                  public User(String name, Book book, Map map){

                     this.name = name;

                     this.book = book;

                     this.map = map;

                  }

                  public String getName() {

                     return name;

                  }

                  public Book getBook() {

                     return book;

                  }

                  public Map getMap() {

                     return map;

                  }

              }

           spring的配置檔案

              <?xml version="1.0"encoding="UTF-8"?>

              <beans xmlns="http://www.springframework.org/schema/beans"

                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                  xsi:schemaLocation="http://www.springframework.org/schema/beans

                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

              <!-- 給bean對象的屬性進行初始化指派,用屬性的set方法-->

                  <!-- 注冊Book對象 -->

                  <bean id="bookObj"class="cn.domain.Book" scope="prototype"></bean>

                  <!-- 注冊User對象,并調用其有參構造方法進行對屬性指派 -->

                  <bean id="user"class="cn.domain.User">

                      <!--

                         constructor-arg标簽表示構造方法所接收的參數

                             index:        表示此參數的下标(從0開始)

                             type:        此參數的類型

                             value:       給此參數要符的值(value隻能賦基類類型的值)

                             ref:         表示給此引用類型變量指派

                       -->

                      <constructor-arg index="0" type="java.lang.String"value="張三"></constructor-arg><!-- 此參數對應name屬性 -->

                      <constructor-arg index="1" type="cn.domain.Book"ref="bookObj"></constructor-arg><!-- 此參數對應book屬性 -->

                      <constructor-arg index="2" type="java.util.Map"><!-- 此參數對應map屬性 -->                     

                         <map>

                            <!-- 一個entry标簽表示一個映射關系 -->

                            <entry key="key1">

                                <value>value1</value>

                            </entry>

                            <!-- 向map集合中存儲一個引用類型的對象 -->

                            <entry key="key2">

                                <ref bean="bookObj"/>

                            </entry>

                         </map>

                     </constructor-arg>

                  </bean>

                  <!--constructor-arg标簽表示有參構造的參數。如果bean标簽中沒有constructor-arg标簽,spring将調用預設的無參構造函數 -->

              </beans>

           測試代碼

              //給bean對象的屬性進行初始化指派,用帶參構造方法初始化

               @Test

              public void test(){

                  //獲的user對象

                  User user = (User)applicationContext.getBean("user");

              //列印user中被初始化的值

                  System.out.println("name="+user.getName());

                  System.out.println("book="+user.getBook());

                  //列印map屬性的值

                  System.out.println("map=");

                  for(Entry ent : (Set<Entry>)user.getMap().entrySet()){

                     System.out.println("    "+ent.getKey()+":"+ent.getValue());

                  }

              }

繼續閱讀