官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html

最近看到朋友遇到一个问题:Spring 依赖注入方式哪一种最好?

笼统的讲,没有最好,只有最合适的。

两种常见的注入方式:

  1. 采用 @Autowired 注解,并注解到普通的 filed 或者 其对应的setter 上。例如:
@Autowired
private Service service;

或者:


private Service service;

@Autowired
public void setService(Service service) {
    this.service = service;
}
  1. 在构造器中添加相应字段,这里可以在构造器上添加 @Autowired 注解,当然也可以省略的。
public class Controller {

    private final Service service;

    public Controller(Service service) {
        this.service = service;
    }
}

第二种是官方文档里面提供的注入方式,当然也是官方在新版的 Spring 推荐的注入方式。

至于为什么呢?最重要的就是 final 关键字了,采用构造器注入可以保证 被依赖对象 为不可变的状态,很显然降低了程序错误的可能性。虽然 @Autowired 注解注入方式很简单,但是并不再被推荐。

当然也避免不了构造器注入方式带来的代码冗长,看起来不舒服。

如果依赖过多,那么是否考虑架构的不合理性了呢?

这并不意味着我们就一定要用构造器注入方式,或者 @Autowired 来注入依赖,我们应当根据合适的架构选择合适的注入方式。

使用场景

我个人总结的使用场景如下:

  1. 当需要保证被依赖者的不变性,且依赖不是很多的时候,则可以考虑采用构造器注入方式进行注入。
  2. 当需要动态依赖的时候,可以考虑采用 @Autowired 注入在 setter 上。