`
sarin
  • 浏览: 1756886 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173657
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368118
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189258
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99838
社区版块
存档分类
最新评论

控制反转和容器(一)

阅读更多
    IoC(Inversion of control,控制反转)是一个通用的设计原则,而DI(Dependency Injection,依赖注入)则是具体的设计模式,它充分体现了IoC的设计原则,是IoC的典型实现(非唯一实现),所以IoC和DI经常混用。Ioc是Spring框架的核心基础,不深入理解它也只能比葫芦画瓢地拷贝applicationContext.xml,做够了搬运工之后还是看看我们每次项目都在搬运的东西到底什么吧。本文不涉及Spring框架,就是研究控制反转和容器。
    案例:开发一个这样的系统,功能之一是生成Bar Chart或Pie Chart不同类型的统计图,实现这个子系统。首先想到了JFreeChart,没错,它是一个非常好用的Java开源图形API,不过这里我们只研究一下控制反转。
    分析:根据面向对象的设计思想,将系统分解成一组可重用的组件,“接口与实现分离”的原则很容易想到。创建出图形的通用接口,再进行具体的实现。我们得到如下代码。

(代码均省略包名和import语句)
public interface ChartGenerator {// 接口
    public void generate(List dataSet); // 抽象方法
}

public class BarChartGenerator implements ChartGenerator {
    public void generate(List dataSet) {
       System.out.println("Generating Bar Chart ... ");
       for (Object data : dataSet) {// JDK5新特性:For-Each循环
           System.out.println(data); 
// System.out.println()方法参数可以是Object型,执行时自动调用对象的toString()方法
       }
    }
}

    PieChartGenerator代码省略,参照上方的即可。
public class ChartService {
    private ChartGenerator chartGenerator = new PieChartGenerator();
    public void generateAnnualChart(int year) {
       List dataSet = new ArrayList();
       dataSet.add("data " + year);
       chartGenerator.generate(dataSet);
    }
    public void generateMonthlyChart(int month) {
       // 实现从略
    }
    public void generateDailyChart(int day) {
       // 实现从略
    }
}

public class Main {
    /** 这是测试程序的入口方法 */
    public static void main(String[] args) {
       ChartService chartService = new ChartService();
       chartService.generateAnnualChart(2009);
    }
}

    至此,任务完成了。可是如果没有一个核心模块来管理这些对象,它们将不得不各自创建和管理自己的依赖,结果就是这些对象会紧紧地耦合在一起,ChartService也定义死了。需求变更时,那就是牵一发而动全身的壮烈景象。一个核心管理者自然要引入了,这里我们使用容器。

public class Container { 
    // 组件用来定位的全局容器类实例 
    public static Container instance; 
    // 用来存储组件的Map对象 
    private Map<String, Object> components; 
    public Container() { 
       components = new HashMap<String, Object>(); 
       instance = this; 
       ChartGenerator chartGenerator = new PieChartGenerator(); 
       components.put("chartGenerator", chartGenerator); 
       ChartService chartService = new ChartService(); 
       components.put("chartService", chartService); 
    } 
    public Object getComponent(String id) {// 根据ID寻找组件对象 
       return components.get(id); 
    } 
} 

public class ChartService { 
private ChartGenerator chartGenerator = (ChartGenerator) Container.instance.getComponent("chartGenerator"); 
    … … … 
} 

public class Main { 
    public static void main(String[] args) { 
       Container container = new Container(); 
       ChartService chartService = (ChartService) container 
              .getComponent("chartService"); 
       chartService.generateAnnualChart(2009); 
    } 
} 

    v2中,加入了容器,又容器管理组件,service类就和组件解除耦合关系,但是此时service类还对容器有依赖,可以采用定位器解除这个依赖关系。

public class ServiceLocator {
    private static Container container = Container.instance;
    public static ChartGenerator getChartGenerator() {
return (ChartGenerator) container.getComponent("chartGenerator");
    }
}

public class ChartService {
private ChartGenerator chartGenerator = ServiceLocator.getChartGenerator();
    …   …   …
}

    服务定位器可以将查找逻辑从组件中分离出来,降低组件在查找方面的复杂性,增加了组件的重用性。但是这种方式依旧存在一个缺点:组件需要知道如何获取资源。那么要解决这个问题,控制反转的思想就要引入了,它是反转资源获取的方向。主动查找方式要求组件向容器发起请求来查找,最为回应,容器返回所需资源。而应用控制反转之后,则是容器主动地将资源送至它所管理的组件里,组件要做的就是选择一种合适的方式来接收资源。对于组件本身,这就是被动查找。
    依赖注入是IoC的实现模式,主要有三种方案:setter方法注入,构造方法注入和接口注入。我们先看接口注入,接口注入要求组件必须实现容器定义的特定接口,容器正是通过这个接口注入依赖。
    个人的一点体会,希望对学习者有用,也欢迎大家交流。(未完待续)
  • 大小: 11.2 KB
  • 大小: 10.6 KB
  • 大小: 12.5 KB
5
0
分享到:
评论
2 楼 sarin 2010-06-01  
qiren83 写道
不错 等下文

http://sarin.iteye.com/blog/593356
1 楼 qiren83 2010-06-01  
不错 等下文

相关推荐

    控制反转和容器(二)

    这个概念的核心是将对象的创建和依赖关系的管理从应用程序代码中剥离出来,转交给一个外部的实体来处理,这就是所谓的“控制反转”。这样做的好处在于,对象间的依赖关系不再由对象自身维护,而是由一个外部的“容器...

    c# 依赖注入 控制反转

    IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行时控制流的方向发生了“反转”。传统的程序设计中,应用程序...

    Spring2[1].5_IoC(控制反转)容器之容器与Bean(附示例)

    Spring IoC(Inversion of Control,控制反转)容器是Spring框架的核心组件之一,用于管理对象的生命周期以及依赖关系。通过Spring IoC容器,开发者能够更加轻松地管理和配置Java应用中的各种组件。 #### 二、...

    Spring IOC 控制反转

    通过上述介绍,我们可以看出Spring IOC控制反转的核心思想是将对象的创建和管理交给了Spring容器,从而实现了组件间的解耦。这种方式极大地提高了代码的可维护性和扩展性,是现代Java开发中不可或缺的一部分。

    Spring自学笔记-Ioc(控制反转)容器

    ### Spring自学笔记-Ioc(控制反转)容器 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用。它提供了一种轻量级的方式来管理应用程序的各种组件和服务,使得开发者能够更容易地构建...

    InversifyJS一个强大的和轻量级控制反转容器支持JavaScript和Nodejs

    在InversifyJS中,控制反转是核心概念。它将对象的创建和管理责任从代码逻辑中分离出来,交由容器负责。这样,当需要一个依赖时,而不是手动创建它,容器会根据配置自动提供。这降低了类之间耦合度,因为类不再直接...

    控制反转应用,模拟Hibernate

    在编程领域,控制反转(Inversion of Control,简称IoC)是一种设计模式,它将对象的创建和管理责任从应用程序转移到框架或容器中。在Java编程中,IoC通过依赖注入(Dependency Injection,DI)来实现,使得组件之间...

    spring 控制反转的模拟程序

    控制反转是一种设计模式,它改变了传统应用程序中对象获取依赖的方式,将对象创建和组装的过程交给容器来管理,从而使代码更加灵活、易于测试和维护。 在Spring框架中,控制反转主要通过两种方式实现:构造器注入和...

    spring技术--IOC控制反转课件.ppt

    其中,IOC(Inversion of Control,控制反转)是Spring的核心特性之一,它改变了传统对象创建和管理的方式,实现了依赖注入(Dependency Injection)。本课件主要介绍了Spring中的IOC原理、特点以及如何使用。 ### ...

    Spring.NET控制反转(IoC)和面向切面(AOP)的容器框架

    Spring.NET 控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理...

    Spring 控制反转 依赖注入

    在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。通过这种方式,开发者可以专注于业务逻辑,而不是对象的...

    体验控制反转的理念及Spring介绍技术文档

    - **Spring Core**:作为Spring的核心容器,它提供了BeanFactory和ApplicationContext等基础功能,实现了工厂模式,并利用控制反转的思想将应用程序代码与其依赖项分离。这一层是整个Spring框架的基石。 - **Spring ...

    asp.net mvc4控制反转

    控制反转的核心理念是将对象的创建和管理权交给一个外部容器,而不是由对象自身负责。在ASP.NET MVC4中,这一概念主要通过依赖注入(Dependency Injection,简称DI)实现。 **1. 依赖注入 (DI)** 依赖注入是IoC的...

    springIOC控制反转 依赖注入实例

    控制反转(IOC)意味着应用程序不再直接创建对象,而是将对象的创建和管理交给一个外部容器(在Spring中就是IOC容器)。这样,开发者可以更专注于业务逻辑,而不是对象的生命周期。依赖注入(Dependency Injection,...

    helloIoc.zip spring ioc控制反转简单测试代码

    控制反转是一种设计原则,它的主要思想是将对象的创建和管理权交给容器,而不是由对象自身负责。在传统的编程模式中,一个对象需要另一个对象时,通常会自行创建或寻找。而在IOC中,对象不再直接创建依赖对象,而是...

    Android中的“控制反转”(下)

    在Android开发中,“控制反转”(Inversion of Control,简称IOC)是一种设计模式,它将对象的创建和管理权从代码本身转移到一个外部容器,如依赖注入框架。本篇文章主要探讨的是Android中如何实现和应用控制反转,...

    Ioc(控制反转)的例子

    "IoC(控制反转)"是软件设计模式中的一个重要概念,它在现代软件开发,特别是.NET框架下的C#编程中占据了核心地位。控制反转的主要思想是将对象之间的依赖关系从代码内部转移到外部容器,从而使代码更加灵活、可...

    学习Spring笔记_IoC(控制反转)简介

    在软件开发中,IoC(Inversion of Control,控制反转)是一种设计模式,它将对象的创建和管理责任从代码中剥离出来,交由一个容器来处理。Spring框架是Java平台上的一个核心组件,其核心特性就是依赖注入...

    IOC控制反转在代码中体现.

    IOC,即控制反转,是一种设计思想,在Java开发领域中,它主要被用来消除程序之间的依赖性,使得类的设计更加灵活。传统的编程模式下,一个类会通过new关键字创建其依赖对象,这种方式会导致耦合度较高,不利于后期的...

    .net autofac 与IOC控制反转来调用数据库事例

    在本案例中,我们将探讨如何使用Autofac来实现数据库操作的控制反转。 首先,了解Autofac的基本概念。Autofac是一个轻量级的DI库,它允许开发者在运行时动态地组合应用程序组件。通过注册服务(接口或抽象类)和...

Global site tag (gtag.js) - Google Analytics