天天看点

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());

                  }

              }

继续阅读