Setter 注入的实现代码如下:

@RestController
public class UserController {
    // Setter 注入
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

优缺点分析

从上面代码可以看出,Setter 注入比属性注入要麻烦很多。 要说 Setter 注入有什么优点的话,那么首当其冲的就是它完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象。 但它的缺点也很明显,它的缺点主要体现在以下 2 点:

  1. 不能注入不可变对象(final 修饰的对象);
  2. 注入的对象可被修改。

接下来我们一一来看。

缺点1:不能注入不可变对象

使用 Setter 注入依然不能注入不可变对象,比如以下注入会报错:

image.png

缺点2:注入对象可被修改

Setter 注入提供了 setXXX 的方法,意味着你可以在任何时候、在任何地方,通过调用 setXXX 的方法来改变注入对象,所以 Setter 注入的问题是,被注入的对象可能随时被修改