Spring IoC

Posted on 2009-11-09 14:34 shoppingbill 阅读(238) 评论(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
Source :Download
Source + Lib :Download





只有注册用户登录后才能发表评论。


网站导航:
 

posts - 6, comments - 0, trackbacks - 0, articles - 0

Copyright © shoppingbill