依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入(Interface Injection),Setter方法注入(Setter Injection)和构造器注入(Constructor Injection)三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。

构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

构造器依赖注入和 Setter方法注入的区别

构造函数注入

setter注入

没有部分注入

有部分注入

不会覆盖 setter 属性

会覆盖 setter 属性

任意修改都会创建一个新实例

任意修改不会创建一个新实例

适用于设置很多属性

适用于设置少量属性

两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。


more

依赖注入(Dependency Injection, DI)可以通过不同的方式实现。以下是几种常见的依赖注入实现方式:

  1. 构造函数注入(Constructor Injection):通过构造函数来注入依赖对象。依赖对象作为构造函数的参数,被传递给类的实例化过程。这种方式要求依赖对象在创建类的实例时必须提供,确保了依赖的完整性。
  2. Setter方法注入(Setter Injection):通过Setter方法来注入依赖对象。依赖对象通过Setter方法来设置给类的成员变量。这种方式允许依赖对象在实例化后通过Setter方法进行注入,可以更灵活地替换依赖对象。
  3. 接口注入(Interface Injection):通过接口方法来注入依赖对象。类实现一个特定接口,接口方法带有依赖对象的参数。依赖对象通过调用接口方法来传递给类。这种方式较少使用,因为它需要类实现接口,增加了代码的复杂性。
  4. 字段注入(Field Injection):通过直接在类的字段上注入依赖对象。依赖对象直接赋值给类的成员变量,通常使用注解来标识注入的字段。这种方式简单直观,但可能破坏了封装原则,不推荐在所有情况下使用。
  5. 方法注入(Method Injection):通过方法来注入依赖对象。依赖对象通过方法参数传递给类的特定方法。这种方式相对较少使用,通常在特定场景下需要动态注入依赖对象时才使用。

选择适当的依赖注入实现方式取决于具体的需求和项目的架构设计。通常,构造函数注入和Setter方法注入是最常用的方式,它们提供了良好的可读性、可测试性和可维护性。字段注入和方法注入可以作为一种简洁的方式,但需要注意潜在的封装破坏和可测试性问题。根据项目的特定情况,可以灵活选择合适的依赖注入方式。