Spring framework 依赖注入篇
如果想区分依赖注入与控制反转(IOC)两者之间的不同,可以参考Martin Fowler给出的解释.查看文章: GO
简单来说,依赖注入的情况如下 :
1
2
3
4
5
6
7
8public class A {
public void importantMethod() {
B b = ... // get an instance of B
b.usefulMethod();
...
}
...
}如果要使用
B,类A必须先获得组件B的实例引用,若B是一个具体类,则可以通过new关键字直接创建组件B实例.但是,如果B是接口,且有多个实现,则问题就变得复杂了,我们固然可以任意选择接口B的一个实现类,但这也意味着A的可重用性大大降低了,因为无法采用B的其他实现.*依赖注入是这样处理此类情景的 : 接管对象的创建工作,并将该对象的引用注入需要该对象的组件.以上述例子为例,依赖注入框架会分别创建对象
A和对象B,将对象B注入到对象A中.为了能让框架进行依赖注入,程序员需要编写特定的set方法或构建方法,例如: 为了能将B注入到A中,类A会被修改成如下形式 :1
2
3
4
5
6
7
8
9
10
11
12public class A {
private B b;
public void importantMethod() {
// no need to worry about creating B anymore.
// B b = ... // get an instance of B.
b.usefulMethod();
...
}
public void setB(B b) {
this.b = b;
}
}修改后的类
A新增了一个setter方法,该方法将会被框架调用,以注入一个B的实例.由于对象依赖由依赖注入,类A的importantMethod()方法不再需要在调用B的usefulMethod()方法前去创建一个B的实例.当然,也可以采用
构造器方式注入,如下所示 : (本例中,Spring会先创建B的实例,再创建实例A,然后把B注入到实例A中.)1
2
3
4
5
6
7
8
9
10
11
12
13public class A {
private B b;
public A(B b){
this.b = b;
}
public void importantMethod() {
// no need to worry about creating B anymore.
// B b = ... // get an instance of B.
b.usefulMethod();
...
}
}注意 :
Spring管理的对象称为beans.
1 | 通过提供一个控制反转器(或者依赖注入器IOC),`Spring`为我们提供一种可以'聪明'地管理Java对象的依赖关系的方法. |
- ClassPathXmlApplicationContext : 在类加载路径中加载配置文件.
- FileSystemXmlApplicationContext : 在文件系统路径中加载文件.
下面为从类路径中加载applicationContext1.xml和applicationContext2.xml的ApplicationContext创建的一个代码示例 :
1 | ApplicationContext context = new ClassPathXmlApplicationContext( |
注 : 理想情况下,我们仅需在测试代码中创建一个
ApplicationContext,应用程序本身无需处理,对于Spring MVC应用,可以通过一个Spring Servlet来处理ApplicationContext,既而无须直接处理.摘抄书籍 : 《 Servlet,JSP and Spring MVC - beginner 》 -> author: [加] Budi Kurniawan [美] Paul Deck