Posted on 2009-11-09 14:34
shoppingbill 阅读(240)
评论(0) 编辑 收藏 所属分类:
Spring
在Spring里Inversion of Control (Ioc)原理是用Dependency Injection(DI)设计模式实现的。让我们通过帮助例子来理解DI。首先我们看一个java版本的例子,然后我们会添加spring的功能。QuizMater接口暴露popQuestion()方法。
1.
QuizMaster.java
2.
----------------
3.
package
com.vaannila;
4.
5.
public
interface
QuizMaster {
6.
7.
public
String popQuestion();
8.
}
StrutsQuizMaster和SpringQuizMaster类实现QuizMaster接口和生成各自相关的popQuestion()
01.
StrutsQuizMaster.java
02.
----------------------
03.
package
com.vaannila;
04.
05.
public
class
StrutsQuizMaster
implements
QuizMaster {
06.
07.
@Override
08.
public
String popQuestion() {
09.
return
"Are you new to Struts?"
;
10.
}
11.
12.
}
01.
SpringQuizMaster.java
02.
----------------------
03.
package
com.vaannila;
04.
05.
public
class
SpringQuizMaster
implements
QuizMaster {
06.
07.
@Override
08.
public
String popQuestion() {
09.
return
"Are you new to Spring?"
;
10.
}
11.
12.
}
我们有一个QuizMasterService类显示question给用户。QuizMasterService处理引用给QuizMaster
01.
QuizMasterService.java
02.
-----------------------
03.
package
com.vaannila;
04.
05.
public
class
QuizMasterService {
06.
07.
private
QuizMaster quizMaster =
new
SpringQuizMaster();
08.
09.
public
void
askQuestion()
10.
{
11.
System.out.println(quizMaster.popQuestion());
12.
}
13.
}
最后我们创建QuizProgram类来管理
01.
QuizProgram.java
02.
----------------
03.
package
com.vaannila;
04.
05.
public
class
QuizProgram {
06.
07.
public
static
void
main(String[] args) {
08.
QuizMasterService quizMasterService =
new
QuizMasterService();
09.
quizMasterService.askQuestion();
10.
}
11.
12.
}
你可以看到这是一个完美的例子。在这里我们创建QuizMasterService类的实例和调用askQuestion()方法。当你运行这个程序的时候
我们渴望的“Are you new to Spring?” 会显示在控制台上。
让我们来看看类图。绿色的箭头表示generalization。蓝色箭头表示association。
你可以看到这个架构是紧密耦合的。
我们在QuizMasterService类是这样创建QuizMaster 实例的:
1.
private
QuizMaster quizMaster =
new
SpringQuizMaster();
如果我们要修改的话:
1.
private
QuizMaster quizMaster =
new
StrutsQuizMaster();
所以它是紧密耦合的。现在就让我们看看怎么样用Dependency Injection设计模式来避免它。Spring框架提供了强大的容器来管理组件。这个容器时基于Ioc原理和用Dependency Injection设计模式实现的。这里的组件只需要选择一种来访问资源,容器会分发资源给组件。
在这个例子我们替代在QuizMasterService中直接创建对象QuizMaster bean。我们用容器来为我们做这份工作代替硬编码。我们会允许容器注入需要的依赖。
我们可以通过setter和constructor注入依赖,这里我们怎么样用setter注入
01.
QuizMasterService.java
02.
-----------------------
03.
package
com.vaannila;
04.
05.
public
class
QuizMasterService {
06.
07.
QuizMaster quizMaster;
08.
09.
public
void
setQuizMaster(QuizMaster quizMaster) {
10.
this
.quizMaster = quizMaster;
11.
}
12.
13.
public
void
askQuestion()
14.
{
15.
System.out.println(quizMaster.popQuestion());
16.
}
17.
}
用setQuizMaster()方法设定QuizMaster的值。QuizMaster对象永远不会在QuizMasterService初始化中
但是当访问它的时候,通常会抛出一个NullPointerException。但是容器会为我们初始化对象。所以我们不
用担心。
修改之后。我们来卡看类图
配置信息在beans.xml如下:
01.
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
02.
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
03.
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
04.
xsi:schemaLocation
=
" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
>
05.
06.
<
bean
id
=
"springQuizMaster"
class
=
"com.vaannila.SpringQuizMaster"
></
bean
>
07.
<
bean
id
=
"strutsQuizMaster"
class
=
"com.vaannila.StrutsQuizMaster"
></
bean
>
08.
<
bean
id
=
"quizMasterService"
class
=
"com.vaannila.QuizMasterService"
>
09.
<
property
name
=
"quizMaster"
>
10.
<
ref
local
=
"springQuizMaster"
/>
11.
</
property
>
12.
</
bean
>
13.
14.
</
beans
>
我用bean标签来定义每个bean,bean标签的id属性给一个逻辑命名给bean和class属性代表实际的bean类用setter注入一个bean你需要用ref标签。这里SpringQuizMaster被注入到QuizMaster bean中。运行这个例子”Are you new to Spring?“会显示在控制台上
如果我们要改的话,我们只需要更改bean的引用ref标签
1.
<
bean
id
=
"quizMasterService"
class
=
"com.vaannila.QuizMasterService"
>
2.
<
property
name
=
"quizMaster"
>
3.
<
ref
local
=
"strutsQuizMaster"
/>
4.
</
property
>
5.
</
bean
>
这样子的话就减少了耦合度
Required Jar:
1.
antlr-runtime-3.0
2.
commons-logging-1.0.4
3.
org.springframework.asm-3.0.0.M3
4.
org.springframework.beans-3.0.0.M3
5.
org.springframework.context-3.0.0.M3
6.
org.springframework.context.support-3.0.0.M3
7.
org.springframework.core-3.0.0.M3
8.
org.springframework.expression-3.0.0.M3
|