Spring学习----------Spring 参数注入方式介绍

在Spring 的配置文件中,用户可以通过Bean的property元素进行参数注入。使用property,不但可以将String、int等字面值注入到Bean中,还可以将集合、Map等类型的注入到Bean中,此外还可以注入配置文件中其他定义的Bean。
在这里,注入参数的类型主要包含以下几种:
1.字面值
一般是指可用字符串表示的值,这些值可以通过<value>元素标签进行注入。
在默认情况下,基本数据类型及其封装类,String等类型都可以采取字面值注入的方式:

我们先看一个简单的小示例:

  1. <bean id=“car” class=“cn.lovepi.***.Car”>  
  2.      <property name=“maxSpeed”>  
  3.           <value>200</value>  
  4.      </property>  
  5.      <property name=“brand”>  
  6.           <value><![CDATA[红旗&CA72]]</value>  
  7.      </property>  
  8. </bean>  
可以看到在给brand的属性注入值的时候使用了一个![CDATA[红旗&CA72]]xml特殊处理标签。CDATA的作用是使xml解析器将标签的内容当作普通文本来对待,以防止某些字符串对xml格式造成破坏。
也可以使用转义序列来代替特殊字符,如下:
  1. <property name=“brand”>  
  2.       <value>  
  3.          红旗&CA72  
  4.       </value>  
  5. </property>  
注意:在一般情况下,xml解析器会忽略元素标签内部字符串前后的空格。但是Spring却不会忽略xml元素标签内部字符串的前后空格。所以当我们在配置相关字面值的时候一定得确认在其前后是不是有空格存在。
2.引用其他的Bean
Spring IoC 容器中定义的Bean 可以互相引用,IoC容器则充当了介绍人的角色:
先来观察一段示例代码:
  1. public class Boss{  
  2.     private Car car;  
  3.     public void setCar(Car car) {  
  4.            this.car = car;  
  5.     }  
  6. }  
在这段代码中Boss类中引用了Car类,其在xml中的配置文件如下:
  1. <bean id=“car” class=“***”/>  
  2. <bean id=“boss” class=“***”>  
  3.     <property name=“car”>  
  4.          <ref bean=“car”></ref>  
  5.     </property>  
  6. </bean>  
可以看到,在property标签中使用了ref标签来引用了其他bean。
<ref>元素引用其他Bean的属性的方法:
  • bean:通过该属性可以引用同一容器或者父容器中的bean
  • local:通过该属性,只能引用同一容器中配置的bean
  • parent:通过该属性,只能引入父类容器中的bean

3.内部bean
当Spring IoC 容器中的bean1只会被bean2引用,而不会被容器中任何其他Bean引用的时候,则可以将这个bean1以内部Bean的方式注入到bean2中:
例如下面这段代码:
  1. <bean id=“boss” class=“***”/>  
  2.      <property name=“car”>  
  3.          <bean class=“***” >  
  4.                  <property name=“price” value=“200”>  
  5.           </bean>  
  6.     </property>  
  7. </bean>  
在这里我们将car这个bean以内部bean的方式注入到了boss这个bean当中。
其实内部bean和java中的匿名内部类是很相似的。
即同样都没有名字,也不能被其他bean所引用,只能在声明处为外部bean提供相关的实例注入。
而且内部bean提供了id、name、scope等属性也是会被忽略的。
4.null值
有时候,需要为某个bean的属性注入一个null值,在这里我们需要使用专用的<null/>元素标签,通过它可以为其他对象类型的属性注入null值:

例如下面这段代码:

错误的注入null值方式
  1. <bean id=“car” class=“***”/>  
  2.      <property name=“brand”>  
  3.          <value></value>  
  4.      </property  
  5. </bean>  
使用null标签注入null值
  1. <bean id=“car” class=“***”/>  
  2.      <property name=“brand”> <null/> </property>  
  3. </bean>  
5.级联属性
和Struts、Hibernate等框架一样,Spring支持级联属性的配置,例如当我们希望在定义bean1时直接为bean2的属性提供注入值,则可以采取以下的配置方式:
  1. <bean id=“boss” class=“***”>  
  2.     <property name=“car.brand”>  
  3.          <value>奔驰E级</value>  
  4.     </property>  
  5. </bean>  
其中属性值的操作为boss调用getCar().setBrand()方法。
此时,必须对boss类来进行改造,即在boss类中声明一个car的初始对象。
  1. public class Boss{  
  2.     private Car car = nea Car();  
  3.     public void setCar(Car car) {  
  4.            this.car = car;  
  5.     }  
  6. }  
注:Spring 3.0当中会自动为内置属性实例化一个对象。且级联属性的层级不受限制。
6.集合类型属性
java.util包中的集合类是最常用的数据结构类型,主要包括List、Set、Map以及Properties
Spring为这些集合类型属性提供了专门的配置元素标签:

那么接下来我们看一看list的集合属性配置方法:
我们首先在类中创建一个list对象:
  1. public class Boss{  
  2.     private List favorites = new ArrayList();  
  3.     public List getFavorites()  {  
  4.             return favorites;  
  5.       }  
  6.     public void setFavorites(List favorites)  {  
  7.            this.favorites = favorites;  
  8.      }  
  9. }  
然后在配置文件当中注入list属性值
  1. <bean id=“boss” class=“***”>  
  2.     <property name=“favorites”>  
  3.            <list>  
  4.                   <value>唱歌</value>  
  5.                   <value>运动</value>  
  6.                   <value>读书</value>  
  7.            </list>  
  8.       </property>  
  9. </bean>  
注:数组格式的属性值也可以使用list来进行注入

当属性为java.util.Set的时候,配置方式如下:
  1. public class Boss{  
  2.     private Set favorites;  
  3.     public Set getFavorites() {  
  4.          return favorites;  
  5.     }  
  6.     public void setFavorites(Set favorites){  
  7.          this.favorites = favorites;  
  8.      }  
  9. }  

  1. <bean id=“boss” class=“***”>  
  2.     <property name=“favorites”>  
  3.            <set>  
  4.                   <value>唱歌</value>  
  5.                    <value>运动</value>  
  6.            </set>  
  7.       </property>  
  8. </bean>  
当属性为java.util.Map的时候,配置方式如下:
  1. public class Boss{  
  2.     private Map favorites;  
  3.     public Map getFavorites() {  
  4.          return favorites;  
  5.     }  
  6.     public void setFavorites(Map  favorites){  
  7.          this.favorites = favorites;  
  8.      }  
  9. }  
  1. <bean id=“boss” class=“***”>  
  2.     <property name=“favorites”>  
  3.            <map>  
  4.                  <entry>  
  5.                       <key><value>key01</value></key>  
  6.                       <value>唱歌</value>  
  7.                  </entry>  
  8.                  <entry>  
  9.                       <key><value>key02</value></key>  
  10.                       <value>唱歌</value>  
  11.                  </entry>  
  12.              </map>  
  13.       </property>  
  14. </bean>  

当map中的键和值都是对象时的配置方法:
  1. <entry>  
  2.       <key><ref bean=“keyBean”/></key>  
  3.       <ref bean=“valueBean”/>  
  4. </entry>  
当属性为java.util.Properties的时候(其实properties可以看作是map的特例,map中的键和值可以是任意元素,但properties中的键和值必须是字符串)配置方式如下:
  1. public class Boss{  
  2.     private Properties favorites;  
  3.     public Properties getFavorites() {  
  4.          return favorites;  
  5.     }  
  6.     public void setFavorites(Properties  favorites){  
  7.          this.favorites = favorites;  
  8.      }  
  9. }  
  1. <bean id=“boss” class=“***”>  
  2.       <property name=“favorites”>  
  3.            <props>  
  4.                  <prop key=“p01”>唱歌</prop>  
  5.                  <prop key=“p02”>运动</prop>  
  6.                  <prop key=“p01”>读书</prop>  
  7.             </props>  
  8.       </property>  
  9. </bean>  
根据JDK5.0提供的强类型集合功能,即允许为集合元素指定相应的类型。在配置文件中,允许为集合元素指定类型:
  1. public class Boss{  
  2.     private Map<Integer, String> favorites;  
  3.     public Map getFavorites() {  
  4.          return favorites;  
  5.     }  
  6.     public void setFavorites(Map  favorites){  
  7.          this.favorites = favorites;  
  8.      }  
  9. }  
  1. <bean id=“boss” class=“***”>  
  2.     <property name=“favorites”>  
  3.            <map>  
  4.                  <entry>  
  5.                       <key><value>101</value></key>  
  6.                       <value>唱歌</value>  
  7.                  </entry>  
  8.              </map>  
  9.       </property>  
  10. </bean>  

配置文件中的集合合并的功能,允许子<bean>集成父<bean>的同名属性集合元素,并将子<bean>中配置的集合属性值和父<bean>中配置的同名属性值合并,作为最终<bean>的属性值:

我们来配置父bean
  1. <bean id=“parentBoss”abstract=“true”class=“***”>  
  2.     <property name=“favorites”>  
  3.            <set>  
  4.                  <value>唱歌</value>  
  5.                  <value>运动</value>  
  6.                 <value>看书</value>  
  7.             </set>  
  8.     </property>  
  9. </bean>  
子bean
  1. <bean id=“childtBoss”parent=“parentBoss”>  
  2.     <property name=“favorites”>  
  3.            <set merge=“true”>  
  4.                  <value>旅游</value>  
  5.                  <value>睡觉</value>  
  6.             </set>  
  7.     </property>  
  8. </bean>  
注意:merge=“true”表示子父类集合合并,false则不合并

当需要配置一个集合类型的Bean,而不是一个集合类型的属性的时候,则可以通过util命名空间进行配置:
  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:util=http://www.springframework.org/schema/util  
  5.     xsi:schemaLocation=“  
  6.               http://www.springframework.org/schema/beans  
  7.               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.               http://www.springframework.org/schema/util  
  9.               http://www.springframework.org/schema/util/spring-util-3.0.xsd">  
  10.   
  11. <util:list id=“favoriteList1”list-class=“java.util.LikedList”>  
  12.          <value>看报</value>  
  13.          <value>赛车</value>  
  14.           <value>高尔夫</value>  
  15. </util:list>  
  16.   
  17. <util:set id=“favoriteSet1”>  
  18.          <value>看报</value>  
  19.          <value>赛车</value>  
  20.           <value>高尔夫</value>  
  21. </util:set>  
  22.   
  23. <util:map id=“favoriteMap1”>  
  24.          <entry key=“101” value=“看报”/>  
  25.          <entry key=“101” value=“赛车”/>  
  26. </util:map>  
前面我们采用完整配置格式的配置方式,但是显得很是拖沓,
Spring为字面值、引用Bean和集合都提供了相对简化的配置方式,
如下是字面值属性简化配置示例:
Spring学习----------Spring 参数注入方式介绍
引用对象属性简化配置示例:
Spring学习----------Spring 参数注入方式介绍

Spring提供一种自动装配的功能,就是不再使用ref进行手工装配Bean,这种方式可以减少配置文件的代码量,但是在大型项目中,不推荐使用,容易混乱。
自动装配类型:
  • autowire=“byName”
  • autowire=“ byType ”
  • autowire=“ constructor ”
  • autowire=“ autodetect ”
注意:
1.     <beans>元素标签中的default-autowire属性可以配置全局自动匹配,其属性的默认值为no,标志不启用自动装配;
2.     在<beans>中定义的自动装配策略可以被<bean>的自动装配策略覆盖;