原创

Sping三种DI(依赖注入)方式及其优缺点

作者:cndz 围观群众:637 更新于 标签:springspring-DI依赖注入依赖注入详解

简介

依赖注入(DI)是一种设计模式,它允许对象相互协作,而不是在代码中直接创建和管理它们之间的依赖关系。Spring中,有多种DI方法可供选择,每种方法都有自己的优点和缺点。在本文中,我们将讨论三种最常见的Java DI方法及其优缺点。下面对它们进行详细介绍。

构造函数注入( spring4.3之后,官方推荐使用 )

代码实例

public class testController {
    private final TestService testService;
    private final TestService2 testService2;

    @Autowired
    public Car(TestService testService,TestServce2 testService2) {
        this.testService = testService;
    }

    //其他代码
}

在上面的代码中如果只有一个构造方法,其实@Autowired注解是可以省略的。

优点

  • 可以使目标类的依赖关系清晰可见。
  • 可以确保依赖关系在目标类实例化时已经准备好了。
  • 可以将依赖关系声明为final类型,从而增加代码的安全性和可读性

缺点

  • 当依赖关系数量增加时,构造函数的签名可能会变得很长,从而降低了代码的可读性。

Setter方法注入

代码实例

public class TestController {
    private TestService testService;
    private TestService2 testService2;

    public TestController() {
    }

    @Autowired
    public void setTestService(TestService testService) {
        this.testService = testService;
    }

    @Autowired
    public void setTestService(TestService2 testService2) {
        this.testService2 = testService2;
    }

    // 其他代码
}

优点

  • 它可以在目标类实例化之后注入依赖关系,从而使目标类的构造函数保持简单
  • Setter方法注入还可以更容易地支持可选的依赖关系,因为可以只注入需要的依赖关系

缺点

  • 在上边的代码中我们可以看到,如果引入过多依赖关系时,可以发现代码会过于臃肿。在实际中很少使用。
  • 由于依赖关系是在目标类实例化之后注入的,因此如果目标类的代码中没有检查依赖关系是否已经设置,则可能会导致NullPointerException等运行时错误

属性注入

public class TestController {
    @Autowired
    private TestService testService;

    @Autowired
    private TestService2 testService2;

    // ...
}

这里是使用 @Autowired 注解注入。另外也有 @Resource 以及 @Inject 等注解,都可以实现注入。

在IDEA中,如果使用@Autowired注解的时候会有一个警告:不推荐属性注入。

优点

  • 它可以使代码变得更加简洁,因为不需要编写构造函数或Setter方法
  • 字段注入还可以更容易地支持可选的依赖关系,因为可以只注入需要的依赖关系

缺点

  • 它会使目标类对Spring框架的依赖性更强,因为它需要Spring来设置字段的值
  • 由于依赖关系是在目标类实例化之后注入的,因此同样可能会导致NullPointerException等运行时错误。

代码实例

结论

在选择DI方式时,需要权衡每种方式的优缺点。构造函数注入可以使代码更加清晰和安全,但当依赖关系数量增加时,构造函数的签名可能会变得很长。Setter方法注入可以使代码更加简洁,但需要在目标类中进行空指针检查等额外的代码。字段注入可以使代码更加简洁,但会增加目标类对Spring框架的依赖性。因此,在选择DI方式时,需要考虑应用程序的需求以及代码的可读性和易维护性。