spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
一、Setter注入
set注入是最简单常用的注入方式
package com.lhk.spring.demo1;
/**
* setter方法的属性注入
*/
public class Car2 {
private String name;
private Double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car2 [name=" + name + ", price=" + price + "]";
}
}
然后编写spring的xml文件:
<!-- setter方式注入 -->
<bean id="car2" class="com.lhk.spring.demo1.Car2">
<property name="name" value="奔驰"></property>
<property name="price" value="500000"></property>
</bean>
<bean>
中的id属性是bean的标识,必须唯一。class属性是类的完全限定名,指明由哪个类来实例化。
<property>
标签中的name就是就是注入方法名去掉前面的set,剩下的这一截首字母大小写可不限。ref指向要注入的对象(id)。对象是引用实例,所以要用ref,如果是传值,则用value。
另外要注意的是:property name只和注入方法名相关,和内部属性名没有关系。
测试方法:
@org.junit.Test
public void TestDemo2(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Car2 car2 = (Car2) ctx.getBean("car2");
System.out.println(car2);
}
输出结果:
Car2 [name=奔驰, price=500000.0]
二、构造器注入
package com.lhk.spring.demo1;
/**
* 构造器方法的属性注入
*/
public class Car {
private String name;
private Double price;
public Car(String name, Double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
然后编写Spring的XML文件:
配置xml文件,spring提供了几种方法:
1、指定参数名
<!-- 构造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg name="name" value="宝马"></constructor-arg>
<constructor-arg name="price" value="1000000"></constructor-arg>
</bean>
<constructor-arg>
顾名思义就是构造函数的参数,name为要注入参数的名字,value为要注入的值。
2、智能识别
<!-- 构造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg value="宝马"></constructor-arg>
<constructor-arg value="1000000"></constructor-arg>
</bean>
<constructor-arg>
没有别的属性。Spring这时会先按类型排序,同类型的按先后顺序向构造函数参数赋值。所以如果完全按照构造函数的参数顺序写,肯定是没有问题的。上面这样写,也是没有问题的,两个String类型的参数顺序对了就行。
3、指定参数类型
<!-- 构造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg type="String" value="宝马"></constructor-arg>
<constructor-arg type="String" value="1000000"></constructor-arg>
</bean>
和智能识别一样,Spring会先按类型区分,同类型的按先后顺序向构造函数参数赋值。
4、指定索引index
<!-- 构造器方式注入 -->
<bean id="car" class="com.lhk.spring.demo1.Car">
<constructor-arg index="0" value="宝马"></constructor-arg>
<constructor-arg index="1" value="1000000"></constructor-arg>
</bean>
指定的索引顺序一定要和类型匹配,不然会报错。构造函数有2个相同类型的参数,指定索引可以解决此种情况。
注意index是从0开始。
测试方法:
@org.junit.Test
public void TestDemo1(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
}
测试结果:
Car [name=宝马, price=1000000.0]