zoukankan      html  css  js  c++  java
  • 为什么要使用构造方法进行依赖注入

    一、前言

    我们在使用Spring框架进行开发时,不可避免的要进行依赖注入(Dependency Injection),也就是把实例从Spring容器中取出来进行使用。Spring的依赖注入方式主要有三种,分别为Constructor、Setter和Field。有了选择的余地,令人纠结的地方就来了,这三种方式哪个更好一些呢?

    二、注入方式对比

    接下来我们逐一看下这三种注入方式:

    Field注入

    @Autowired
    private DependencyA dependencyA;
    

    优点

    • 注入简单,只需在字段上添加@Autowired或@Resource;
    • 减少大量冗余代码,美观;
    • 新增Field时不需要过多代码修改;

    缺点

    • 很难测试,因为没有带参构造和set方法,难以在容器以外使用。
    • 依赖不能是final的
    • 容易出现循环依赖

    Setter注入

    private DependencyB dependencyB;
    @Autowired
    public void setDependencyB(DependencyB dependencyB) {
        this.dependencyB = dependencyB;
    }
    

    优点

    • 对循环依赖免疫

    • 在对象的整个生命周期内,可以随时动态的改变依赖。

    缺点

    • 依赖不能是final的

    Constructor注入

    private DependencyC dependencyC;
    @Autowired
    public DI(DependencyC dependencyC) {
        this.dependencyC = dependencyC;
    }
    

    优点

    • 依赖可以是final的
    • 高耦合类随着构造参数的增长很容易被识别出来
    • 不需要依赖@Autowired注解(当类中只有一个构造方法时,可以省略@Autowired)

    缺点

    • 代码显得十分臃肿

    三、选择哪种注入方式

    Spring官方目前推荐的是构造器注入。根据官方的说法,因为它使人们能够将应用程序组件实现为不可变对象,并确保所需的依赖项不为null。此外,注入构造函数的组件总是以完全初始化的状态返回到客户端(调用)代码。

    • 不可变对象:说的是可以是字段用final关键字修饰。
    • 依赖不为null:因为有了自定义的构造函数,所以程序不再提供默认的空参构造,类在实例化时必须传入所有需要的参数。
    • 完全初始化的状态:构造方法的作用就是初始化成员变量,在Java类加载实例化的过程中,构造方法是最后一步,所以返回来的组件都是初始化之后的状态。

    四、总结

    三种方式各有利弊,从靠谱程度来说,还是构造器注入更好一些,它能有效避免一些比如循环依赖、空指针等异常的发生。另外,Spring中Bean默认为单例的,有可能会出现线程安全问题,这个时候final就更有必要了。当然,其他两种方式也有其自己的发光点,我们可以按实际需要选择使用,或混合使用。

  • 相关阅读:
    git基础命令学习总结
    php 阿里云短信服务及阿里大鱼实现短信验证码的发送
    用Laravel Sms实现 laravel短信验证码的发送
    php定时执行操作及ob_flush()与flush()的使用
    composer安装laravel指定版本
    laravel5.4生成验证码
    larave5.4自定义公共函数的创建
    laravel5.4生成验证码
    Swagger解决你手写API接口文档的痛
    不是所有OutOfMemoryError异常都跟内存有关
  • 原文地址:https://www.cnblogs.com/hanstrovsky/p/11601010.html
Copyright © 2011-2022 走看看