`
反求诸己
  • 浏览: 543181 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

依赖注入的几种实现类型

阅读更多

Type1 接口注入


我们常常借助接口来将调用者与实现者分离。如:
public class ClassA {
private InterfaceB clzB;
public doSomething() {
Ojbect obj =
Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
clzB.doIt()
}
……
}

上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在
代码中创建InterfaceB实现类的实例,并将起赋予clzB。
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有
了上面的代码,我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态
加载实现类,并通过InterfaceB强制转型后为ClassA所用。这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成。
如下面这个类:
public class ClassA {
private InterfaceB clzB;
public Object doSomething(InterfaceB b) {
clzB = b;
return clzB.doIt();
}
……
}

在运行期,InterfaceB实例将由容器提供。
Type1型IOC发展较早(有意或无意),在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的
方法也已经频繁出现在我们的代码中。
下面的代码大家应该非常熟悉:

public class MyServlet extends HttpServlet {
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
……
}
}

这也是一个Type1 型注入,HttpServletRequest和HttpServletResponse实例由Servlet Container
在运行期动态注入。
另,Apache Avalon是一个较为典型的Type1型IOC容器。

 

Type2 设值注入

在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得
力于Spring框架的影响)。
在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。Quick Start中的示例,就是典
型的设置注入,即通过类的setter方法完成依赖关系的设置。

 

Type3 构造子注入

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

public class DIByConstructor {
private final DataSource dataSource;
private final String message;
public DIByConstructor(DataSource ds, String msg) {
this.dataSource = ds;
this.message = msg;
}
……
}

可以看到,在Type3类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构
造方法,将其所需的依赖关系注入其中。
PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type3类型的依赖注入模式。

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

接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如
其他两种注入模式,因而在IOC的专题世界内并不被看好。
Type2和Type3型的依赖注入实现则是目前主流的IOC实现模式。这两种实现方式各有特点,也各具
优势(一句经典废话J)。
Type2 设值注入的优势
1. 对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直
观,更加自然。
2. 如果依赖关系(或继承关系)较为复杂,那么Type3模式的构造函数也会相当庞大(我们需
要在构造函数中设定所有依赖关系),此时Type2模式往往更为简洁。
3. 对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如Struts
中的Action),此时Type3类型的依赖注入机制就体现出其局限性,难以完成我们期望的功
能。

Type3 构造子注入的优势:
1. “在构造期即创建一个完整、合法的对象”,对于这条Java设计原则,Type3无疑是最好的
响应者。
2. 避免了繁琐的setter方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,
更加易读。
3. 由于没有setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于
相对“不变”的稳定状态,无需担心上层代码在调用过程中执行setter方法对组件依赖关系
产生破坏,特别是对于Singleton模式的组件而言,这可能对整个系统产生重大的影响。
4. 同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。
对调用者而言,组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的
层次清晰性提供了保证。
5. 通过构造子注入,意味着我们可以在构造函数中决定依赖关系的注入顺序,对于一个大量
依赖外部服务的组件而言,依赖关系的获得顺序可能非常重要,比如某个依赖关系注入的
先决条件是组件的DataSource及相关资源已经被设定。
可见,Type3和Type2模式各有千秋,而Spring、PicoContainer都对Type3和Type2类型的依赖注
入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type3类型为主,辅之以Type2
类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,
Type2使用更加广泛。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=498586

 

分享到:
评论

相关推荐

    spring学习:依赖注入的几种方式讨论

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...

    .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在...今天我们就来一起探讨下实现这种需求的几种实现方式吧。

    依赖注入那些事儿

    依赖注入可以根据依赖传递的方式分为以下几种类型: - **Setter注入**:通过setter方法来注入依赖。 - **构造函数注入**:通过构造函数参数来注入依赖。 - **依赖获取**:对象主动请求依赖项。 ##### 3.1.1 Setter...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

    C++ 依赖注入

    在C++中实现依赖注入,主要有几种方法: 1. 组装元(Composition Root):在应用程序的入口点(如main函数)或某个统一的位置,负责组装并初始化对象,将依赖关系注入到需要的对象中。 2. 构造函数注入:通过对象的...

    IoC 依赖注入 技术总结

    "IoC 依赖注入 技术总结" IoC 依赖注入技术是软件设计中...IoC 框架的设计是实现 IoC 依赖注入技术的重要组件,需要完成以下几个基本的功能。IoC 框架的设计可以分为动态 IoC 和静态 IoC 两种,每种设计都有其优缺点。

    spring依赖注入的几种方式

    Spring 依赖注入的几种方式 依赖注入(Dependency Injection,简称 DI)是一种设计模式,它可以将对象之间的耦合关系降到最低,从而提高系统的灵活性和可维护性。在 Spring 框架中,依赖注入是通过 IoC 容器来实现...

    Spring Ioc 注解 依赖注入

    下面介绍几种常用的依赖注入相关的注解: - **@Component**:用于标记一个普通的Java类为Spring管理的Bean。 - **@Service**:通常用于标记业务层的组件。 - **@Repository**:用于标记数据访问层(DAO层)的组件。...

    Angular6依赖注入Demo

    在Angular中,依赖注入主要体现在以下几个方面: 1. **服务(Services)**:服务是最常见的依赖注入使用场景,它们提供了一种在组件之间共享数据和功能的方式。通过`@Injectable()`装饰器创建服务,并使用`@...

    Java开发学习(六)----DI依赖注入之setter及构造器注入解析.doc

    例如,在一个类中需要传递数据的方式有几种?普通方法(set 方法)、构造方法、引用类型、简单类型(基本数据类型与 String)等。Spring 框架基于这些知识点,为我们提供了两种注入方式:setter 注入和构造器注入。 ...

    依赖注入概念

    依赖注入可以通过以下几种方式实现: 1. **构造函数注入**:通过类的构造函数参数传递依赖项。这是最常用的一种方式,因为可以清晰地表明类所需的依赖,并且可以确保依赖项在类初始化时已经准备好。 ```csharp ...

    Unity实现依赖注入基础

    Unity实现依赖注入的基础包括以下几个关键概念: 1. **依赖**: 在软件中,一个类通常依赖于其他类来完成某些功能。这些被依赖的类被称为依赖。 2. **接口**: 接口定义了一组方法,实现了该接口的类必须提供这些...

    Spring的依赖注入,与前置通知的实例

    在Spring中,依赖注入主要通过以下几种方式实现: 1. **构造器注入**:通过在类的构造函数中传递依赖对象的实例,Spring容器会在创建目标对象时调用合适的构造函数并注入依赖。 2. **setter注入**:在类中定义...

    利用xml解析完成依赖注入 源码

    XML解析则是实现依赖注入的一种常见方式,尤其是在Spring框架中广泛使用。本篇文章将深入探讨如何利用XML解析来完成依赖注入,并结合源码`xmlparse_Ioc`进行详细解释。 首先,我们要理解什么是依赖注入。依赖注入的...

    Spring_依赖注入_面向接口编程

    在Spring配置文件中,我们可以指定使用哪个实现类,并通过依赖注入将其注入到需要使用该服务的类中。这样,当我们需要更换服务实现时,只需更改配置,而无需修改调用者的代码。 在本项目"Spring_依赖注入_面向接口...

    Spring学习笔记(6)----编码剖析Spring依赖注入的原理

    总结一下,Spring依赖注入的原理主要包括以下几点: 1. 通过构造器或setter方法实现组件间的依赖关系。 2. 使用`@Autowired`注解自动匹配和注入依赖。 3. Bean工厂和ApplicationContext管理bean生命周期,Bean...

    关于spring boot中几种注入方法的一些个人看法

    @Resource 可以用在方法、属性、类上,通过 CommonAnnotationBeanPostProcessor 类实现依赖注入,与 @Autowired 一致。但可以指定 name 属性来指定 beanName,但如果 name 对应的 bean 不存在,则会抛出异常。 3. @...

    Spring 依赖注入的几种方式详解

    在Spring中,依赖注入可以通过XML配置文件实现,本文将重点介绍两种常见的注入方式:Set注入和构造器注入。 1. Set注入 Set注入是最常见的注入方式,适用于对象没有默认构造函数或构造函数不接受参数的情况。首先,...

Global site tag (gtag.js) - Google Analytics