`
ivorytower
  • 浏览: 74006 次
  • 性别: Icon_minigender_1
  • 来自: 成都-->@深圳
社区版块
存档分类
最新评论

Spring学习 -----IoC和DI概述

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



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)  对象必须提供运行时修改依赖关系的途径(我认为这点是最主要的)

分享到:
评论

相关推荐

    maven-spring-ioc

    **Spring IoC 框架详解** Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是...通过不断的实践和学习,你将能够充分利用Spring框架的强大功能,构建出更加灵活、可扩展的应用系统。

    Spring--IOC学习资料(pdf)

    根据给定的文件信息,以下是对Spring框架及其IOC特性详细的知识点总结: ...总之,Spring通过其核心的IOC/DI机制,结合广泛的整合能力和强大的社区支持,为企业级应用开发提供了一个稳定、高效、易于扩展的基础平台。

    官方完整包 spring-framework-5.3.7.RELEASE-dist.zip

    - **spring-5.3.7-docs.zip**:包含完整的官方文档,包括用户指南、参考手册和API文档,是学习和开发过程中的重要参考资料。 - **spring-5.3.7-schema.zip**:可能包含Spring配置文件的XML模式定义,有助于验证...

    spring-framework-4.3.6.RELEASE.rar

    1. Beans:Spring的核心是依赖注入(Dependency Injection,DI),它允许通过XML配置或注解来管理对象的生命周期和依赖关系。4.3.6版本对DI进行了优化,提升了容器启动速度和内存使用效率。 2. Core:提供了基础的...

    跟我学spring3-源码.

    《跟我学Spring3-源码》教程是一份深入解析Spring框架3.x版本核心源码的教育资源,适合对Java和J2EE技术有一定基础的开发者学习。本教程旨在帮助读者理解Spring框架的工作原理,提高在实际项目中的应用能力。通过...

    spring-framework-3.0.RELEASE

    1. **spring-core**:核心工具包,提供基本的Spring功能,包括IoC容器和基本的类型转换。 2. **spring-context**:包含应用程序上下文,是DI容器的核心,提供事件、国际化、资源加载等功能。 3. **spring-beans**...

    Spring4Ioc-Aop

    Spring的核心特性包括轻量级、依赖注入(DI/IOC)、面向切面编程(AOP)等,这使得它成为当今最流行的企业级Java开发框架之一。 #### 二、Spring的轻量级特性 - **非侵入性**:基于Spring开发的应用中的对象可以不...

    spring-framework-3.2.4-RELEASE Maven Source Code

    - **IoC容器**:深入研究`org.springframework.beans`和`org.springframework.context`包,可以理解Spring如何通过XML或注解实现依赖注入。 - **AOP实现**:在`org.springframework.aop`包中,可以看到Spring如何...

    spring-framework-1.0-m1.zip源码

    1.0版本的发布标志着Spring的诞生,它引入了依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)的概念,这两大核心特性至今仍是Spring框架的基础。 二、依赖注入与控制反转 1. 依赖...

    spring-framework-3.2.5.RELEASE.rar

    - `spring-core.jar`:包含了Spring框架的基础组件,如IoC容器和基本的工具类。 - `spring-beans.jar`:实现了bean的定义、创建、装配和管理。 - `spring-context.jar`:扩展了`spring-core`,提供了与企业服务...

    spring-framework-reference

    1. **Spring Core Container**:包括Beans和Core模块,是整个Spring框架的基础,提供了IoC和DI功能。 2. **Data Access/Integration**:包括JDBC、ORM、OXM(Object-XML Mapping)、JMS(Java Message Service)和...

    spring-framework-2.0.6-with-dependencies.zip

    1. **IoC容器**:Spring的核心是IoC容器,它负责管理对象的生命周期和对象间的关系。BeanFactory是基础容器,ApplicationContext则提供了更多的企业级服务。 2. **AOP代理**:Spring通过动态代理或CGLIB实现AOP,...

    spring-framework-5.0.2.RELEASE-dist.rar

    Spring Framework 是一个开源的应用框架,旨在简化Java开发,通过依赖注入(DI)和面向切面编程(AOP)提供了一个全面的解决方案。它支持多种应用程序类型,包括Web、批处理和企业级服务,同时提供了对Java EE平台...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    ### Spring框架概述 #### 1. Spring框架简介 Spring是一个由Rod Johnson创建的轻量级Java开发框架,它为Java应用程序提供了全面的基础架构支持。Spring的核心目标在于简化企业级应用的开发过程,降低开发难度的...

    Spring IoC讲解PPT

    **Spring 框架概述** Spring 是一个开源的 Java 应用框架,由 Rod Johnson 在其...通过学习和实践 Spring 框架,开发者可以掌握一套完整的解决方案,提高开发效率,降低项目风险,并能够更好地应对软件需求的变化。

    spring-framework-2.5.4-with-dependencies

    Spring框架的核心特性在于IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),它通过管理对象的生命周期和依赖关系,降低了组件之间的耦合度。此外,Spring还提供了诸如数据访问、事务...

    spring培训-笔记

    Spring框架概述 3 Spring是什么? 3 Spring的历史 4 Spring的使命(Mission Statement) 4 Spring受到的批判 4 Spring包含的模块 5 总结 6 Spring的IoC容器 6 用户注册的例子 7 面向接口编程 8 (用户持久...

    官方原版源码spring-framework-5.1.13.RELEASE.zip

    开发者可以从中学习到如何实现IoC(Inversion of Control)和DI(Dependency Injection),以及AOP(Aspect Oriented Programming)等相关概念。 - **spring-framework-5.1.13.RELEASE-docs.zip**:文档部分提供...

    spring-framework-2.5.6-with-dependencies

    Spring的核心理念是“依赖注入”(Dependency Injection,DI),它通过反转控制(Inversion of Control,IoC)实现了对象之间的解耦,使得代码更加灵活,易于测试和维护。此外,Spring还提供了一整套服务,包括数据...

Global site tag (gtag.js) - Google Analytics