构造函数注入和 Setter 依赖注入

简介: 【8月更文挑战第22天】

构造函数注入和 Setter 依赖注入都是向类提供依赖关系的常用方法。它们各有优缺点,在不同的情况下可能更合适。

构造函数注入

构造函数注入涉及在创建类实例时通过构造函数传递依赖关系。

public class MyClass {
   

    private MyDependency dependency;

    public MyClass(MyDependency dependency) {
   
        this.dependency = dependency;
    }

    // ...
}

优点:

  • 显式依赖关系:构造函数注入使依赖关系显式,很容易看到哪些类依赖于哪些其他类。
  • 不可变性:一旦实例化,通过构造函数注入的依赖关系是不可变的。这有助于确保对象的不可变性。
  • 测试方便:通过构造函数注入依赖关系,可以轻松地在测试中模拟或替换依赖关系。

缺点:

  • 构造函数臃肿:随着依赖关系数量的增加,构造函数可能会变得臃肿和难以维护。
  • 不可变依赖关系:在某些情况下,可能需要在对象的生命周期内更改依赖关系。构造函数注入不允许这样做。

Setter 依赖注入

Setter 依赖注入涉及在实例化类之后使用 setter 方法设置依赖关系。

public class MyClass {
   

    private MyDependency dependency;

    public void setDependency(MyDependency dependency) {
   
        this.dependency = dependency;
    }

    // ...
}

优点:

  • 灵活性:Setter 依赖注入允许在对象的生命周期内更改依赖关系。
  • 构造函数简洁:使用 Setter 依赖注入,构造函数可以保持简洁,只包含必需的参数。
  • 延迟初始化:依赖关系可以根据需要延迟初始化,这在某些情况下可能是有利的。

缺点:

  • 隐式依赖关系:Setter 依赖注入使依赖关系更隐式,更难识别哪些类依赖于哪些其他类。
  • 潜在错误:如果忘记设置依赖关系,可能会导致运行时错误。
  • 测试困难:在测试中模拟或替换通过 Setter 依赖注入的依赖关系可能更困难。

哪种方法更好?

选择构造函数注入还是 Setter 依赖注入取决于具体情况。以下是一些一般准则:

  • 如果需要不可变的依赖关系或显式的依赖关系,则使用构造函数注入。
  • 如果需要灵活性或延迟初始化,则使用 Setter 依赖注入。
  • 如果构造函数的参数数量较多,则考虑使用 Setter 依赖注入以保持构造函数简洁。

结论

构造函数注入和 Setter 依赖注入都是向类提供依赖关系的有效方法。根据具体要求和偏好,选择最合适的方法至关重要。

目录
相关文章
获取类中所有的bean
获取类中所有的bean
44 0
SpringBoot静态属性赋值:@Value注入静态属性
SpringBoot静态属性赋值:@Value注入静态属性
258 0
|
容器
什么是依赖注入?有哪些注入方式?
什么是依赖注入?有哪些注入方式?
153 0
|
Java 容器 Spring
七.Spring源码剖析-Bean的实例化-属性注入
喜欢我的文章的话就给个好评吧,你的肯定是我坚持写作最大的动力,来吧兄弟们,给我一点动力 这一章节我们来讨论创建Bean过程中的属性注入,在Spring的IOC容器启动过程中,会把定义的Bean封装成BeanDefinition注册到一个ConcurrentHashMap中,Bean注册完成后,就会对单利的且lazy-init=false 的Bean进行实例化。创建Bean的代码在 AbstractAutowireCapableBeanFactory#doCreateBean 中,当Bean创建成功之后,会调用AbstractAutowireCapableBeanFactory#populat
|
设计模式
依赖注入和构造器注入的区别
依赖注入和构造器注入的区别
|
Java 容器 Spring
构造器注入
构造器注入
IOC创建对象方式
1.使用无参构造创建对象,默认!
|
缓存 Java 开发者
Spring源码(八)-构造方法实例化Bean-createBeanInstance
各位小伙伴好,这是 Spring 源码系列的第八篇文章。本篇篇幅较长(五千八百字),建议收藏慢慢品尝。
656 1
|
Java Spring
spring学习42-属性注入中注入引用对象
spring学习42-属性注入中注入引用对象
80 0
spring学习42-属性注入中注入引用对象