一、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 @Override14 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 @Override34 public String toString() {35 return "Car2 [name=" + name + ", color=" + color + "]";36 }37 38 }39 40 package cn.itcast.spring.di;41 42 //employee 引用一个复杂数据类型 Car243 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 @Override56 public String toString() {57 return "Employee [name=" + name + ", car2=" + car2 + "]";58 }59 60 }61 62 6364 65 66 69 70 7167 68 72 73 76 77 7874 75 79 80 81 82
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 @Test12 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 @Test21 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 元素
12 3 4
简化为:
1 2
4、SpEL (Spring Expression Language ) 的使用
Spring 3.0 创建了一种新的方式用以配置对象的注入(set 注入或者构造参数注入),它便是SpEL (Spring Expression Language)
语法格式 : #{...}
用法一: 向一个Bean 引用另一个Bean
1------ >
用法二: 使用另一个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 }
12 3 4
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 }
12 3 64 5
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 Listhobbies; 5 private Set cars; 6 private Map webSiteVisitMap; 7 private Properties employees; 8 9 public void setHobbies(List hobbies) {10 this.hobbies = hobbies;11 }12 13 public void setCars(Set cars) {14 this.cars = cars;15 }16 17 public void setWebSiteVisitMap(Map webSiteVisitMap) {18 this.webSiteVisitMap = webSiteVisitMap;19 }20 21 public void setEmployees(Properties employees) {22 this.employees = employees;23 }24 25 @Override26 public String toString() {27 return "CollectionBean [hobbies=" + hobbies + ", cars=" + cars28 + ", webSiteVisitMap=" + webSiteVisitMap + ", employees="29 + employees + "]";30 }31 32 }33 34 35 36 37 66 67 68 69 // 测试集合属性赋值70 @Test71 public void demo5() {72 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(73 "applicationContext.xml");74 CollectionBean collectionBean = (CollectionBean) applicationContext75 .getBean("collectionBean");76 System.out.println(collectionBean);77 }38 44 4539
43体育 40音乐 41爬山 4246 51 5247 48 49 5053 57 58 5960 6561 64传智播客 62黑马程序员 63