@TOC

在这里插入图片描述
欢迎关注微信公众号:数据科学与艺术

1. 使用 @Autowired 注解

@Autowired
private ServertService serverService;

这种方式是 Spring 框架提供的自动注入机制。@Autowired 注解告诉 Spring 容器自动将匹配的 Bean 注入到相应的字段中。这种方式的优点是简单易用,不需要手动编写构造器或 setter 方法来进行依赖注入。

2. 使用构造器注入

private final ServertService serverService;

public ServiceImpl(ServertService serverService) {
    this.serverService= serverService;
}

这种方式使用构造器注入来初始化依赖项。构造器注入是一种推荐的做法,因为它使得依赖关系更加明确,并且有利于单元测试。这种方式通常与 final 修饰符一起使用,确保依赖项不可更改,即依赖项是不可变的。

区别总结

  1. 可测试性:

    • 使用构造器注入可以更容易地进行单元测试,因为可以在构造器中传递依赖项,从而轻松地替换或模拟依赖对象。
    • 使用 @Autowired 注解的字段注入则不太适合单元测试,因为你无法在测试中轻松地替换这些依赖。
  2. 依赖不变性:

    • 构造器注入通常伴随着 final 修饰符,这意味着依赖项一旦设置就不能改变,这对于保证对象的不变性和线程安全性很有帮助。
    • 使用 @Autowired 的字段注入则没有这样的保证,依赖项可以随时改变。
  3. 强制性:

    • 当你使用 @Autowired 注解时,Spring 容器会尝试自动注入 Bean。如果找不到合适的 Bean,Spring 可能不会抛出异常,除非你显式地标记该字段为 @Required 或者使用 @Autowired(required=true)
    • 构造器注入则要求必须提供依赖项,否则编译将失败,因此更加严格。
  4. 可读性和明确性:

    • 构造器注入通常被认为更加清晰,因为依赖关系在构造器中明确列出。
    • 字段注入可能使得依赖关系不够明显,尤其是在较大的类中。
  5. 灵活性:

    • 字段注入提供了更多的灵活性,因为它可以在运行时动态改变依赖项。
    • 构造器注入则更加严格,依赖项在对象创建时就已经确定。

总结

这两种写法都是在类中注入依赖的方式,但它们之间有一些重要的区别。下面分别解释两种方式:

  • 推荐做法:

    • 对于不可变的依赖项,推荐使用构造器注入。
    • 对于可变的依赖项,可以考虑使用 @Autowired 的 setter 注入或其他方式。
  • Spring 推荐:

    • Spring 框架官方文档推荐使用构造器注入作为首选的依赖注入方式,特别是在依赖项不可变的情况下。

根据具体情况选择合适的方法。在大多数情况下,构造器注入提供了更好的可测试性和代码质量,因此被广泛认为是最好的实践。


贺公子
388 声望269 粉丝

要用技术的影响力来领导人,而不是威权和职位