`
spark_li
  • 浏览: 20781 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

依赖注入的三种方式以及优缺点。

 
阅读更多

依赖注入是指在创建一个对象时,自动地创建它依赖的对象,并注入。
大家都知道有三种途径来实现依赖注入,我这里总结一下这三种方式的优缺点:

 

1.构造方法注入:

优点:

  • 在构造方法中体现出对其他类的依赖,一眼就能看出这个类需要其他那些类才能工作。
  • 脱离了IOC框架,这个类仍然可以工作,POJO的概念。
  • 一旦对象初始化成功了,这个对象的状态肯定是正确的。

缺点:

  • 构造函数会有很多参数(Bad smell)。
  • 有些类是需要默认构造函数的,比如MVC框架的Controller类,一旦使用构造函数注入,就无法使用默认构造函数。
  • 这个类里面的有些方法并不需要用到这些依赖(Bad smell)。
2.  Set方法注入:
优点:
  • 在对象的整个生命周期内,可以随时动态的改变依赖。
  • 非常灵活。
缺点:
  • 对象在创建后,被设置依赖对象之前这段时间状态是不对的。
  • 不直观,无法清晰地表示哪些属性是必须的。
3. 方法参数注入:
方法参数注入的意思是在创建对象后,通过自动调用某个方法来注入依赖。类似如下代码。
public class MovieRecommender {

  private MovieCatalog movieCatalog;

  private CustomerPreferenceDao customerPreferenceDao;

  @Autowired
  public void prepare(MovieCatalog movieCatalog,
                      CustomerPreferenceDao customerPreferenceDao) {
      this.movieCatalog = movieCatalog;
      this.customerPreferenceDao = customerPreferenceDao;
  }

  // ...
}
这种方式介于Set方法注入和构造方法注入之间。比如说我们通常会用一个Init方法来接受依赖的参数。
这种方法可能不太常用,一般是只有一个方法依赖到注入的对象时用到,如果有多个方法依赖到注入的对象,还是比较倾向于使用构造方法注入。
优点:
  • 比较灵活。
缺点:
  • 新加入依赖时会破坏原有的方法签名,如果这个方法已经被其他很多模块用到就很麻烦。
  • 与构造方法注入一样,会有很多参数。

我个人很不倾向于在业务逻辑层中应用Autowired 或者是 Inject这样的annotation(Attribute)来实现注入,因为一旦脱离了IOC框架,代码就无法重用了。

 

 

分享到:
评论

相关推荐

    spring依赖注入三种方式 测试源码

    以上三种方式在实际开发中各有优缺点,构造器注入保证了对象在创建时就完整,适合依赖不可变的情况;设值注入则更加灵活,可以在对象生命周期中随时调整依赖;接口注入则更适用于需要统一管理依赖的场景。 在提供的...

    IoC 依赖注入 技术总结

    使用完全格工具,可以更加精确、完整地描述 IoC 依赖注入技术的机制,包括依赖注入如何应对软件需求的变化、依赖注入的起始、结束状态以及注入过程中可能经过的执行途径等。 IoC 框架是实现 IoC 依赖注入技术的重要...

    两种依赖注入的类型

    在Java应用中,特别是Spring框架,依赖注入主要通过两种方式实现:setter注入和构造方法注入。 ### Setter注入 setter注入是最常见的依赖注入方式。它通过类的setter方法来设置对象的依赖关系。以下是一个简单的...

    Spring三种注入方式(一)

    总结来说,Spring的三种注入方式各有优缺点。构造器注入适用于核心业务逻辑,确保对象在创建时就拥有所有必需的依赖;设值注入则提供了更大的灵活性,但可能带来对象状态管理的风险;接口注入在特定情况下能提供额外...

    面试官常问的spring依赖注入和bean的装配问题.pdf

    字段注入是通过使用@Autowired注解直接在成员变量上进行依赖注入的一种方式。这种方式代码最为简洁,但缺点是丧失了灵活性,因为它不直接指定注入的来源,而是依赖于Spring的自动装配机制。在Spring 4.3及以后的版本...

    Spring依赖注入的三种方式小结

    Spring依赖注入的三种方式小结 Spring框架是当今最流行的JavaEE开发框架之一,它...Spring框架提供了三种依赖注入方式,每种方式都有其优缺点。开发者可以根据实际情况选择合适的依赖注入方式来实现应用程序的开发。

    Spring的优缺点及工作原理

    Spring的核心特性主要包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect-Oriented Programming, AOP)以及其他辅助功能,例如数据访问、事务管理和MVC支持等。 #### Spring的IoC(控制反转) **...

    mybatis-plus优缺点

    ### Mybatis-Plus优缺点详解 #### 一、框架介绍 Mybatis-Plus是一个针对MyBatis框架的增强工具包,旨在简化常见的CRUD(创建、读取、更新、删除)操作,提升开发效率。它在不改变原有MyBatis核心功能的基础上,...

    Spring三种注入方式(二)

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本篇主要介绍Spring中的三种注入方式,着重讲解在"Spring三种注入...

    三大框架的优缺点

    然而,Struts1存在一些缺点,比如Action类过于庞大,难以管理和调试,且对依赖注入(DI)支持不够完善。Struts2在Struts1的基础上进行了改进,引入了拦截器(Interceptor)机制,增强了灵活性,但同时也增加了复杂性...

    Ajax工作原理以及优缺点

    ### Ajax工作原理及优缺点详解 #### 一、Ajax的工作原理 Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。这种技术的核心在于使用`...

    Spring的注入方式详解

    下面我们将详细探讨Spring 中的三种注入方式:接口依赖注入(Type1)、setter/getter 注入(Type2,也称为属性注入)和构造方法注入(Type3)。 1. **接口依赖注入(Type1)** 这种注入方式相对不常见,主要适用于...

    ssh框架优缺点

    1. **依赖注入(DI)和面向切面编程(AOP):**Spring框架的核心是依赖注入和面向切面编程,极大地提高了代码的可重用性和可维护性。 2. **模块化:**Spring框架由多个模块组成,可以根据项目的实际需求选择使用哪些...

    进程注入技术的三种实现方法

    Windows钩子、`CreateRemoteThread`结合`LoadLibrary`以及`CreateRemoteThread`结合`WriteProcessMemory`这三种方法各有优缺点。开发者应根据实际需求选择合适的技术方案。同时,需要注意的是,不当使用这些技术可能...

    SSH框架的优缺点

    Spring是Java企业级应用的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等特性。Spring的优点主要包括: 1. **DI和AOP**:使得组件之间的耦合度降低,增强了代码的灵活性和可测试性。 2. **模块化结构**:...

    JAVA三大框架优缺点

    1. **依赖注入(DI):** Spring的核心特性之一是依赖注入,它允许开发者以声明的方式管理组件间的依赖关系,降低了模块间的耦合度。 2. **面向切面编程(AOP):** 通过AOP,Spring支持横切关注点(如日志记录、...

    ssh框架的介绍以及优缺点

    - **控制反转(IoC)**:通过依赖注入(DI)的方式,Spring使得对象之间的依赖关系由容器来控制,降低了组件间的耦合度。 - **面向切面编程(AOP)**:Spring支持AOP,可以方便地实现日志记录、事务管理等功能,...

    19-12-04_AutofacFramework(002WEB动态实例UnitOfWork--MiniProfiler调用模式,通过Autofac依赖注入)

    描述中提到的".Net Framework框架使用MEF和Autofac依赖注入容器实现依赖注入的第4个工程代码",意味着这个项目是系列教程的一部分,它利用了两种不同的DI工具:Managed Extensibility Framework (MEF)和Autofac。...

    Struts,Spring,Hibernate优缺点

    Struts、Spring 和 Hibernate 是Java Web开发中三大主流的开源框架,它们各自有着独特的功能和优缺点。在构建企业级应用程序时,理解这些框架的核心特性以及它们如何相互补充至关重要。 Struts 是一个基于MVC...

Global site tag (gtag.js) - Google Analytics