依赖注入Bean属性
一、Bean属性依赖注入
对于类成员变量,注入方式有三种
•构造函数注入
•属性setter方法注入
•接口注入
Spring支持前两种
1、构造函数 属性注入
使用构造方法注入,在Spring配置文件中,通过<contruct-arg>设置注入的属性(可以通过index或者type注入)
![](http://images0.cnblogs.com/blog/574093/201310/25154836-3a6be76bbf8049fc956456920c20cfcf.png)
![](http://images0.cnblogs.com/blog/574093/201310/25154911-37cf13fe750f41f0a4c03368435e4f83.png)
2、setter方法注入
使用setter方法注入,在Spring配置文件中,通过<property>设置注入的属性
![](http://images0.cnblogs.com/blog/574093/201310/25155240-228ace634dba409c9608248c998ced99.png)
![](http://images0.cnblogs.com/blog/574093/201310/25155315-2c0a21c39dee418fb7f02209911bb621.png)
注入一个复杂类型,通过<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 属性赋值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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 属性赋值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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 }