`
Far_ranqing
  • 浏览: 10673 次
  • 性别: Icon_minigender_2
  • 来自: 保定
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Spring基础语义(一)

阅读更多

Spring基础语义()

何谓控制反转(IoC=Inversion of Control),何谓依赖注入(DI=Dependency Injection)?

IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

IoC的另一个新名字:“依赖注入(Dependency Injection)

所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。

依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。

    回顾上一节中的示例,GreetingServiceImpl在运行前,其say节点为空。运行后由容器将字符串“Spring 春天注入。此时GreetingServiceImpl即与内存中的”Spring 春天字符串对象建立了依赖关系。

 

依赖注入机制减轻了组件之间的依赖关系,同时也大大提高了组件的可移植性,这意味着,组件得到重用的机会将会更多。

依赖注入的几种实现类型

Type1 接口注入

我们常常借助接口来将调用者与实现者分离。如:

public class ClassA {

private InterfaceB clzB;

public init() {

Ojbect obj =

Class.forName(Config.BImplementation).newInstance();

clzB = (InterfaceB)obj;

}

……

}

上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在

代码中创建InterfaceB实现类的实例,并将起赋予clzB

而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有

了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB

制转型后为ClassA所用。

这就是接口注入的一个最原始的雏形。

而对于一个Type1IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的

Context.lookupServletContext.getXXX),都是Type1IOC的表现形式。

Apache Avalon是一个典型的Type1IOC容器。

Type2 构造子注入

构造子注入,即通过构造函数完成依赖关系的设定,如:

public class DIByConstructor {

private final DataSource dataSource;

private final String message;

public DIByConstructor(DataSource ds, String msg) {

this.dataSource = ds;

this.message = msg;

}

……

}

可以看到,在Type2类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构

造方法,将其所需的依赖关系注入其中。

PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type2类型的依赖注入模式。

Type3 设值注入

在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得

力于Spring框架的影响)。

在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。Quick Start中的示例,就是典

型的设置注入,即通过类的setter方法完成依赖关系的设置。

几种依赖注入模式的对比总结

接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有

限。

Type2Type3的依赖注入实现模式均具备无侵入性的特点。在笔者看来,这两种实现方式各有特点,

也各具优势(一句经典废话J)。

Type2 构造子注入的优势:

1. “在构造期即创建一个完整、合法的对象”,对于这条Java设计原则,Type2无疑是最好的

响应者。

2. 避免了繁琐的setter方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,

更加易读。

3. 由于没有setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于

相对“不变”的稳定状态,无需担心上层代码在调用过程中执行setter方法对组件依赖关系

产生破坏,特别是对于Singleton模式的组件而言,这可能对整个系统产生重大的影响。

4. 同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。

对调用者而言,组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的

层次清晰性提供了保证。

5. 通过构造子注入,意味着我们可以在构造函数中决定依赖关系的注入顺序,对于一个大量

依赖外部服务的组件而言,依赖关系的获得顺序可能非常重要,比如某个依赖关系注入的

先决条件是组件的DataSource及相关资源已经被设定。

Type3 设值注入的优势

1. 对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直

观,更加自然。

2. 如果依赖关系(或继承关系)较为复杂,那么Type2模式的构造函数也会相当庞大(我们需

要在构造函数中设定所有依赖关系),此时Type3模式往往更为简洁。

3. 对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如Struts

中的Action),此时Type2类型的依赖注入机制就体现出其局限性,难以完成我们期望的功

能。

可见,Type2Type3模式各有千秋,而SpringPicoContainer都对Type2Type3类型的依赖注

入机制提供了良好支持。这也就为我们提供了更多的选择余地。__________理论上,以Type2类型为主,辅之以Type3

类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,

Type3使用更加广泛。

分享到:
评论

相关推荐

    spring教程+电子书

    **Spring 基础语义**: - **Dependency Injection (DI)**:依赖注入是一种设计模式,用于简化对象之间的耦合。在 Spring 中,可以通过三种方式实现依赖注入: - **接口注入**:通过接口传递依赖对象。 - **设值...

    spring-5.2.9.RELEASE-dist.zip(spring-framework-5.2.9.RELEASE)

    "libs"文件夹下包含了一系列的JAR包,它们是Spring Framework的基础组件和依赖库。这些JAR包涵盖了Spring的核心模块,如core-container、web、data、amqp、batch等,还包括了对其他开源框架如Hibernate、MyBatis的...

    Spring开发指南

    在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...

    Spring项目的xsd文件大全

    Spring Cloud是一个建立在Spring Boot基础上的工具集,用于快速构建分布式系统,如服务发现、配置中心、断路器等。Spring Cloud的相关XSD文件如`spring-cloud-netflix.xsd`包含了Eureka服务发现、Zuul边缘服务等的...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程式...

    Spring Data MongoDB中文文档

    这部分内容为 Spring Data 文档支持提供了一些基础介绍,并假设用户已经熟悉文档数据库(如 MongoDB 和 CouchDB)以及 Spring 的概念。 在 Spring Data MongoDB 中,最显著的功能之一是仓库(Repository)支持。...

    spring教程-经典官方教程(适合初学者)

    - 构建Spring基础代码、Spring基础语义、Dependency Injection等章节,详细阐述了Spring的核心概念,如依赖注入(DI),这是Spring框架的核心特性之一。依赖注入支持多种实现类型,包括接口注入、构造子注入和设值...

    spring+MVC中文教程pdf

    2. Spring基础语义:讲解了Spring的核心概念,包括依赖注入(Dependency Injection,DI)。 3. 依赖注入的几种实现类型: - Type1接口注入:通过对象的接口实现依赖的注入。 - Type2构造子注入:通过构造函数实现...

    spring-aop-3.0.xsd spring-beans-3.0 spring-context-3.0.xsd spring-mvc-3.1.xsd

    `spring-beans` 是 Spring 框架的基础,它处理所有对象的创建、配置和管理。`spring-beans-3.0.xsd` 文件定义了 Spring 容器如何读取并解析 XML 配置文件,来实例化、装配和管理 beans。在这个文件中,你可以定义 ...

    spring中文教程(spring开发指南)_Final.doc

    #### Spring基础语义 - **Dependency Injection (DI)**:即依赖注入,是Spring框架的核心特性之一,它允许在运行时自动完成对象间的依赖关系绑定,从而提高代码的灵活性和可测试性。 - **Type1 接口注入**:通过...

    spring MVC中文教程.pdf

    在构建Spring基础代码时,需要理解Spring基础语义,其中的核心概念之一是依赖注入(Dependency Injection,DI),它允许通过构造器参数、工厂方法参数或属性来将依赖关系注入到对象中。 依赖注入有几种实现类型,...

    spring 4.2.5 jar包 及 注解

    1. @Component:这是所有Spring组件的基础注解,可以标记在任何bean类上,表明该类将被Spring容器管理。 2. @Service、@Repository和@Controller:它们分别用于标记服务层、数据访问层和控制器层的组件,是对@...

    Spring中文教程+案例

    #### Spring基础语义 ##### Dependency Injection (DI) 依赖注入是Spring框架的核心特性之一,它允许开发者以声明式的方式来管理对象间的依赖关系,而不是硬编码在代码中。这种方式极大地提高了代码的灵活性和可...

    spring+MVC中文教程pdf.pdf

    - **Spring基础语义**:理解Spring框架的基本概念和术语对于正确使用Spring至关重要。 - **依赖注入的几种实现类型**:了解并选择合适的依赖注入方式,可以使代码结构更加清晰、可读性更强。 2. **Spring MVC的...

    spring MVC中文教程

    - **Spring基础语义**:深入探讨Spring框架的基本概念和技术细节,如依赖注入、AOP等方面的知识。 #### 六、实战经验分享 - 本书还包含了许多作者在实际项目中的经验和心得,这些实践经验对于读者理解和应用Spring ...

Global site tag (gtag.js) - Google Analytics