依赖注入Bean属性

一、Bean属性依赖注入
对于类成员变量,注入方式有三种
  •构造函数注入
  •属性setter方法注入
  •接口注入
Spring支持前两种
1、构造函数 属性注入
使用构造方法注入,在Spring配置文件中,通过<contruct-arg>设置注入的属性(可以通过index或者type注入)
 
 
2、setter方法注入
 
使用setter方法注入,在Spring配置文件中,通过<property>设置注入的属性
 
 
注入一个复杂类型,通过<property> ref属性 引用其他Bean
 1 package cn.itcast.spring.di;
 2 //构造方法注入
 3 public class Car {
 4     private String name;
 5     private String color;
 6 
 7     public Car(String name, String color) {
 8         super();
 9         this.name = name;
10         this.color = color;
11     }
12 
13     @Override
14     public String toString() {
15         return "Car [name=" + name + ", color=" + color + "]";
16     }
17 }
18 
19 package cn.itcast.spring.di;
20 //setter方法注入
21 public class Car2 {
22     private String name;
23     private String color;
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public void setColor(String color) {
30         this.color = color;
31     }
32 
33     @Override
34     public String toString() {
35         return "Car2 [name=" + name + ", color=" + color + "]";
36     }
37 
38 }
39 
40 package cn.itcast.spring.di;
41 
42 //employee 引用一个复杂数据类型 Car2
43 public class Employee {
44     private String name;
45     private Car2 car2;
46 
47     public void setCar2(Car2 car2) {
48         this.car2 = car2;
49     }
50 
51     public void setName(String name) {
52         this.name = name;
53     }
54 
55     @Override
56     public String toString() {
57         return "Employee [name=" + name + ", car2=" + car2 + "]";
58     }
59 
60 }
61 
62     <!-- 使用构造函数 完成属性注入 -->
63     <bean id="car" class="cn.itcast.spring.di.Car">
64         <!-- 构造函数注入 通过constructor-arg  -->
65         <!-- 通过索引和类型,指定注入参数位置 -->
66         <constructor-arg index="0" type="java.lang.String" value="宝马"></constructor-arg>
67         <constructor-arg index="1" type="java.lang.String" value="红色"></constructor-arg>
68     </bean>
69     
70     <!-- 使用setter 方法注入 -->
71     <bean id="car2" class="cn.itcast.spring.di.Car2">
72         <!-- setter 方法注入 ,根据setter 方法编写注入属性  -->
73         <property name="name" value="保时捷"></property>
74         <property name="color" value="黑色"></property>
75     </bean>
76 
77         <!--注入一个复杂类型,通过<property> ref属性 引用其他Bean -->
78     <bean id="employee" class="cn.itcast.spring.di.Employee">
79         <property name="name" value="小丽"></property>
80         <!-- ref 引用另一个Bean -->
81         <property name="car2" ref="car2"></property>
82     </bean>

 

 1 // 测试复杂类型 注入
 2     @Test
 3     public void demo3() {
 4         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
 5                 "applicationContext.xml");
 6         Employee employee = (Employee) applicationContext.getBean("employee");
 7         System.out.println(employee);
 8     }
 9 
10     // 测试setter 方法注入
11     @Test
12     public void demo2() {
13         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
14                 "applicationContext.xml");
15         Car2 car2 = (Car2) applicationContext.getBean("car2");
16         System.out.println(car2);
17     }
18 
19     // 测试构造函数属性注入
20     @Test
21     public void demo1() {
22         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
23                 "applicationContext.xml");
24         Car car = (Car) applicationContext.getBean("car");
25         System.out.println(car);
26     }

 

3、p名称空间的使用

从spring2.5版本,为了简化 bean属性注入写法,引入p名称空间

p:<属性名>="xxx"  引入常量值

p:<属性名>-ref="xxx"  引入其他bean对象

 

使用p名称空间之前,先引用p名称空间:"xmlns:p="http://www.springframework.org/schema/p" 加入bean 元素  

1 <bean id="employee" class="cn.itcast.spring.di.Employee">
2         <property name="name" value="小丽"></property>
3         <property name="car2" ref="car2"></property>
4 </bean>

简化为:  

1 <!-- 使用p名称空间 -->
2 <bean id="employee" class="cn.itcast.spring.di.Employee" p:name="小丽" p:car2="#{car2}" />

4、SpEL (Spring Expression Language ) 的使用

Spring 3.0 创建了一种新的方式用以配置对象的注入(set 注入或者构造参数注入),它便是SpEL (Spring Expression Language)

语法格式 : #{...}

用法一: 向一个Bean 引用另一个Bean

1 <property name="car2" ref="car2" />  ------ >  <property name="car2" value="#{car2}" /

 

用法二: 使用另一个Bean属性 为当前Bean 属性赋值

 1 public class CarInfo {
 2     // 说明CarInfo 有个 name 属性
 3     public String getName() {
 4         return "奇瑞QQ";
 5     }
 6 
 7     // 是一个普通方法
 8     public String initColor() {
 9         return "白色";
10     }
11 
12 }
View Code 
1     <bean id="carinfo" class="cn.itcast.spring.di.CarInfo"></bean>
2     <bean id="car3" class="cn.itcast.spring.di.Car2">
3         <property name="name" value="#{carinfo.name}"></property>
4     </bean>

        car3 的name值,调用 carinfo对象 getName() 方法
       

用法三 : 使用另一个Bean 方法 ,为当前Bean 属性赋值    

 1 public class CarInfo {
 2     // 说明CarInfo 有个 name 属性
 3     public String getName() {
 4         return "奇瑞QQ";
 5     }
 6 
 7     // 是一个普通方法
 8     public String initColor() {
 9         return "白色";
10     }
11 
12 }
View Code
1      <bean id="carinfo" class="cn.itcast.spring.di.CarInfo"></bean>
2      <bean id="car3" class="cn.itcast.spring.di.Car2">
3          <property name="name" value="#{carinfo.name}"></property>
4          <property name="color" value="#{carinfo.initColor()}"></property>
5      </bean>
6         

        car3 的color值,有carinfo对象 initColor方法提供的
   

用法四: 读取properties 文件的值

 

5、如何向一个Bean对象 ,注入集合类型的属性

    List 、Set 、 Map 、Properties
 1 // 集合Bean ,向Bean中注入 List 、 Set 、Map 、Properties 对应数据
 2 
 3 public class CollectionBean {
 4     private List<String> hobbies;
 5     private Set<Car2> cars;
 6     private Map<String, Integer> webSiteVisitMap;
 7     private Properties employees;
 8 
 9     public void setHobbies(List<String> hobbies) {
10         this.hobbies = hobbies;
11     }
12 
13     public void setCars(Set<Car2> cars) {
14         this.cars = cars;
15     }
16 
17     public void setWebSiteVisitMap(Map<String, Integer> webSiteVisitMap) {
18         this.webSiteVisitMap = webSiteVisitMap;
19     }
20 
21     public void setEmployees(Properties employees) {
22         this.employees = employees;
23     }
24 
25     @Override
26     public String toString() {
27         return "CollectionBean [hobbies=" + hobbies + ", cars=" + cars
28                 + ", webSiteVisitMap=" + webSiteVisitMap + ", employees="
29                 + employees + "]";
30     }
31 
32 }
33 
34 <!-- 向Bean注入 集合类型属性 -->
35     <bean id="collectionBean" class="cn.itcast.spring.di.CollectionBean">
36         <!-- 注入list 基本数据类型 -->
37         <property name="hobbies">
38             <list>
39                 <value>体育</value>
40                 <value>音乐</value>
41                 <value>爬山</value>
42             </list>
43         </property>
44         <!-- 注入 Set 复杂数据类型 -->
45         <property name="cars">
46             <set>
47                 <ref bean="car2"/>
48                 <ref bean="car3"/>
49             </set>
50         </property>
51         <!-- 注入Map -->
52         <property name="webSiteVisitMap">
53             <map>
54                 <entry key="传智播客" value="100"></entry>
55                 <entry key="黑马程序员" value="110"></entry>
56             </map>
57         </property>        
58         <!-- 注入property -->
59         <property name="employees">
60             <props>
61                 <prop key="张三">传智播客</prop>
62                 <prop key="李四">黑马程序员</prop>
63             </props>
64         </property>
65     </bean>
66     
67 </beans>
68 
69     // 测试集合属性赋值
70     @Test
71     public void demo5() {
72         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
73                 "applicationContext.xml");
74         CollectionBean collectionBean = (CollectionBean) applicationContext
75                 .getBean("collectionBean");
76         System.out.println(collectionBean);
77     }

 

 

posted @ 2013-10-25 15:54  海天依色  阅读(752)  评论(0编辑  收藏  举报