在实际的开发中,我们反复尽量避免尽量降低对象间的依赖关系即耦合度。但是如何才能做到呢? 通常的业务对象之间都是依赖关系的,业务对象与业务对象,业务对象与持久层,业务对象与各种资源之间都存在这样和那样的依赖关系。
IoC (Inversion Of Control)中文名为控制反转,就是由容器来控制业务对象之间的依赖关系,而非传统实现中,由代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。控制权的转移带来的好处就是降低了业务对象之间的依赖程度。
IoC实现策略:
1) 依赖查找:容器中的受控对象通过容器的API来查找自己所依赖的资源和协作对象。这种方式虽然降低了对象间的依赖,但是同时也使用到了容器的API,造成了我们无法在容器外使用和测试对象。
2)依赖注入:对象只提供普通的方法让容器去决定依赖关系,容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的 getter和setter,.NET中的property)或者是构造子传递给需要的对象。通过属性注射依赖关系的做法称为设值方法注入(Setter Injection),将构造子参数传入的做法称为构造子注入(Constructor Injection)
IoC的第二种策略 依赖注入是一种更加合适的方法。让容器去全权负责依赖查询,受控对象只要暴露属性和代参数的构造子,使容器可以在初始化对象的时候设置对象间的依赖关系。这种方式往往不需要依赖特定API和接口,完全只要依赖语言本身就可以实现了。Spring之父Rod Johnson称之为language-based IoC。
这样做的好处:
1) 查询依赖操作和应用代码分离。
2) 受控对象不会使用到容器的特定的API。这样我们的受控对象可以搬出容器单独使用。
现在让我们来看看依赖注入的两种实现方法。
(一)设值方法注入(Setter Injection)
使用设值方法注入的时候,受控对象通过属性来表达自己所依赖的对象和所需配置的值。Java实现中,只要对象提供JavaBean标准的属性就可以了。例如:
public class MyBusinessObject {
private DataSource ds;
public DataSource getDataSource() {
return ds;
}
public void setDataSource(DataSource ds) {
this.ds = ds;
}
// 具体的业务逻辑
}
这样当容器实例化对象MyBusinessObject的时候,会立即调用设值方法,将所需的DataSource传递给MyBusinessObject。
可以看出MyBusinessObject只是一个普通的Java对象,完全没有依赖IoC容器。这样它就可以在容器外运行。
(二)构造子注入(Constructor Injection)
如果使用构造子注入MyBusinessObject大概会是这样的。
public class MyBusinessObject {
private DataSource ds;
public MyBusinessObject(DataSource ds) {
this.ds = ds;
}
// 具体的业务逻辑
}
可以看出这也是一个简单的Java对象,它也同样不依赖IoC容器。
比起以前在应用代码中的查找,创建依赖对象的方法来看,这两种注入方法都有着巨大的进步。但是我们该如何选择呢。到底是使用设值方法注入还是构造子注入呢。
让我先来看看这两种方法的优缺点。
设值方法注入的主要优点:
1) 每个设值方法都有一个对应的读取方法,这样就可以要求受控对象汇报自身的状态。
2) 父类的属性可以被子类继承而无需重新编码。
设值方法注入的主要缺点:
1) 设置方法的调用次序无法规定
2) 在使用对象前,可能存在不是所有的设值方法都会调用到,可能存在着未配置完全的状态。
构造子注入的主要优点:
1) 在使用之前,对象必定处于配置完全的状态。
2) 比起多个设值方法来说一个构造函数的代码量可能更少,当然两者的复杂程度是没有区别的。
构造子注入的主要缺点:
1) 构造子无法被自动被继承。
2) 构造子参数太多和构造子操作太多都不方便于使用
3) IDE对设值方式要比构造子参数列表有更好的支持。
由此可见在下列情况下,设值方法注入更有优势:
1) 需要配置的属性很多
2) 对象位于继承体系中
3) 对象必须提供运行时修改依赖关系的途径(我认为这点是最主要的)
以上是本人学习Spring的时候对IoC和DI的一些理解。虽然大部分都来自于Rod Johnson的《export one-on-one J2EE Development without EJB》。
参考:
Rod Johnson的《export one-on-one J2EE Development without EJB》。
夏昕的《Spring 开发指南》
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/paopao_36/archive/2007/06/05/1638701.aspx
分享到:
相关推荐
**Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...
SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...
Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...
Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...
Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...
Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...
在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...
1. 反射的基本概念:介绍什么是Java反射,它的用途,以及如何通过Class类、Constructor类、Method类和Field类来使用反射。 2. 反射的实际应用:包括动态加载类、创建对象、访问私有成员、调用方法等实例。 3. Spring...
**Spring 的 IoC 容器** IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和...
Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,使得应用程序不再负责对象的生命周期,而是由Spring容器来负责。这种设计模式...