Spring依赖注入
当我们在一个类A中需要使用另一个类B的时候我们就称之为A对于B的依赖,越是大的项目依赖就越是复杂,如果有朝一日需要对于项目进行重构或者是其他的重写的话,依赖复杂的情况将对于我们来说造成不小的阻碍。
所以我们理所当然的寻求一种减少我们依赖的方式和方法,以及框架之类的帮助,之后Spring成功的提供了这个功能——依赖注入。这个功能配合接口类的时候方便我们极大的降低了我们类之间的依赖关系。
测试实例
然后我们照例通过一个例子来看看我们依赖注入的过程。
在这里我们分别列出我们的创建的接口、实例以及我们的测试代码
@Test
public void test005(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");
System.out.println("获取Bean实例开始............");
The3thTestBean bean01 = (The3thTestBean)ctx.getBean("3stBean_1");
bean01.show();
}
之后是我们的XML配置
<bean id = "3stBean_1" class = "test.The3thTestBean" lazy-init="true" >
<property name="x" ref="3stBean_0"></property>
</bean>
<bean id = "3stBean_0" class = "test.bean.The3thBean" lazy-init="true" >
</bean>
测试接口
package test.interfaces;
public interface The3thInterface {
public void action();
}
接口实现
package test.bean;
import test.interfaces.The3thInterface;
public class The3thBean implements The3thInterface{
@Override
public void action() {
System.out.println("the The3thBean is action>>>>>>>>>");
}
}
测试使用Bean
package test;
import test.interfaces.The3thInterface;
public class The3thTestBean {
private The3thInterface x;
public The3thInterface getX() {
return x;
}
public void setX(The3thInterface x) {
this.x = x;
}
public void show(){
x.action();
}
}
以及我们之后的结果
获取Bean实例开始............
the The3thBean is action>>>>>>>>>
详细解释
可以看到一个简单的测试变成了如此的复杂,但是这个复杂是值得的,通过这个复杂的结构以及Spring的参与实现了依赖的注入。
这个测试的各个步骤的流程如下
由于我们这个流程的变化,我们其实并没有在代码中将3stBean_1中的属性private The3thInterface x;进行实例化,这个实例化的步骤交给了spring框架带为完成,这样就是我们依赖注入的过程。
这个依赖注入的好处我想现在可以是显而易见的,譬如,在这里如果我们需要替换其中The3thInterface x的实现我们仅需要在我们的配置文件中修改一下注入到3stBean_1中的x参数即可(当前我们使用的是3stBean_0、也许之后会有3stBean_233同样实现The3thInterface接口的Bean可以被注入)
集合类属性的装配
接下来我们简单的介绍一下我们的集合类的内容装配,由我们刚刚第一个例子我们可以看到我们Bean中的属性是可以让Spring代为注入的,这个确实变得很方便,但是随之而来一个问题,如果我需要注入的是一个集合类,并且希望集合类在初始化的时候已经存在一些的值了怎么办?
当然这个做框架的团队自然已经提前有所准备了,所以这里也有相应的办法能够让我们比较轻松的直接把初始化好的集合类注入进去。
测试实例
在之前测试3上的基础稍作修改就能够进行测试了,我们现在我们需要注入的Bean中新建三种不同类型的集合类
package test;
import java.util.List;
import java.util.Map;
import java.util.Set;
import test.interfaces.The3thInterface;
public class The3thTestBean {
private The3thInterface x;
private List list;
private Map map;
private Set set;
public The3thInterface getX() {
return x;
}
public void setX(The3thInterface x) {
this.x = x;
}
public void show(){
x.action();
System.out.println("list = "+list.size());
System.out.println("map = "+map.size());
System.out.println("set = "+set.size());
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
}
XML配置改动
<bean id="3stBean_1" class="test.The3thTestBean" lazy-init="true">
<property name="x" ref="3stBean_0"></property>
<property name="list">
<list>
<value>"4356456"</value>
</list>
</property>
<property name="map">
<map>
<entry key="key0" value="heihei"></entry>
<entry key="key1" value="hehe"></entry>
</map>
</property>
<property name="set">
<set>
<value>"233"</value>
<value>"2333"</value>
<value>"23333"</value>
</set>
</property>
</bean>
结果如下所示
获取Bean实例开始............
the The3thBean is action>>>>>>>>>
list = 1
map = 2
set = 3