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