Sping三种DI(依赖注入)方式及其优缺点
作者:cndz
围观群众:637
更新于 2023-07-19 23:23:39
标签:spring spring-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方式时,需要考虑应用程序的需求以及代码的可读性和易维护性。