`
天涯之海
  • 浏览: 48800 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

spring ioc是什么

阅读更多
在实际的开发中,我们反复尽量避免尽量降低对象间的依赖关系即耦合度。但是如何才能做到呢? 通常的业务对象之间都是依赖关系的,业务对象与业务对象,业务对象与持久层,业务对象与各种资源之间都存在这样和那样的依赖关系。

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
分享到:
评论

相关推荐

    springIoc实现原理

    **Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...

    实验一 Springioc基本操作.docx

    SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...

    Spring中IoC优点与缺点解析

    Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    Spring IoC加载流程讲解

    Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...

    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 IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    Springioc注入Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...

    Spring IoC依赖包

    Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...

    Spring IOC.pdf

    Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...

    以注解方式模拟Spring IoC AOP

    在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...

    Java反射_Spring IOC

    1. 反射的基本概念:介绍什么是Java反射,它的用途,以及如何通过Class类、Constructor类、Method类和Field类来使用反射。 2. 反射的实际应用:包括动态加载类、创建对象、访问私有成员、调用方法等实例。 3. Spring...

    Spring IoC讲解PPT

    **Spring 的 IoC 容器** IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和...

    springioc的详细讲解

    Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,使得应用程序不再负责对象的生命周期,而是由Spring容器来负责。这种设计模式...

Global site tag (gtag.js) - Google Analytics