在我们写代码的过程中,通常会用new来产生一个对象,但是这样操作的后果会使得代码难于管理。
而Spring框架为我们提供了一个控制反转(IOC,Inversion of Control)的思想。意思是原来由程序员new出来的对象,现在不这样做了,而是把它“反转”。由Spring容器去产生管理这些对象。而依赖注入(DI,Dependency Injection)就是实现控制反转的其中一种方式。
一.set注入:需生产set方法
例1:比如主板类中(Mainboard)含有Cpu对象(Cpu)和Ram(Ram)对象:先生成此两个对象的set方法,分别注入:
public interface Mainboard extends PCComponent{
private Cpu cpu;
private Ram ram;
public void setCpu(Cpu cpu);
public void setRam(Ram ram);
}
随后编写Spring的配置文件applicationContext.xml。<bean>中的name为类的一个别名,而class为类的完整名称。
<bean id="mainboard" class="com.spring.service.pc.Ipml.InterBoard">
<property name="cpu">
<bean class="com.spring.service.pc.Ipml.InterCpu"></bean>
</property>
<property name="ram">
<bean class="com.spring.service.pc.Ipml.KingstoneRam"></bean>
</property>
</bean>
例2:创建一个pojo的car类:属性有汽车名字/价格/颜色
public class car implements Serializable {
private String name;
private String color;
private double price;
public car() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
随后编写Spring的配置文件applicationContext.xml。<bean>中的name为类的一个别名,而class为类的完整名称。分别给汽车名字及汽车颜色与汽车价格进行赋值
<bean id="car" class="com.spring.service.pojo.car" >
<!--Set方式注入,-->
<!-- <property name="name" value="B驰"></property>
<property name="color" value="红色"></property>
<property name="price" value="66"></property>-->
</bean>
二.构造器注入(需生产带参数的构造方法):
构造器注入指的是在类中构造带参数的构造方法实现类的注入,它又可以分为以下几种方式注入:索引注入/数据类型注入
使用方式:
第一,在类中,不用为属性设置setter方法,但是需要生成该类带参的构造方法。
第二,在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了<constructor-arg>节点,该节点有四个属性:
· index是索引,指定注入的属性,从0开始;
· type是指该属性所对应的类型;
· ref 是指引用的依赖对象;
· value 当注入的不是依赖对象,而是基本数据类型时,就用value;
1.索引注入:
public class car implements Serializable {
private String name;
private String color;
private double price;
public car(String name, String color, double price) {
this.name = name;
this.color = color;
this.price = price;
}
}
在配置文件中,不再用<property>标签,而是用<constructor-arg>标签代替,其中索引序号不能乱:
<constructor-arg index="0" value="B驰"></constructor-arg>
<constructor-arg index="1" value="红色"></constructor-arg>
<constructor-arg index="2" value="66"></constructor-arg>
2.类型注入,其中类型顺序不能乱:
<constructor-arg type="java.lang.String" value="奥迪" ></constructor-arg>
<constructor-arg type="java.lang.Double" value="500000"></constructor-arg>
<constructor-arg type="java.lang.String" value="黑色"></constructor-arg>
注意:属性中含有List,Array,Map类型时:了解如下写法:
<constructor-arg index="3" >
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
<map>
<entry key="id" value="1"></entry>
</map>