一、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 > 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 > 72 <!-- setter 方法注入 ,根据setter 方法编写注入属性 --> 73 <property name="name" value="保时捷"></property> 74 <property name="color" value="黑色"></property> 75 </bean> 76 77 <!--注入一个复杂类型,通过<property> ref属性 引用其他Bean --> 78 <bean > 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 > 2 <property name="name" value="小丽"></property> 3 <property name="car2" ref="car2"></property> 4 </bean>
简化为:
1 <!-- 使用p名称空间 --> 2 <bean />
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 }
1 <bean ></bean> 2 <bean > 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 }