【发布时间】:2021-05-25 12:00:43
【问题描述】:
我是 Spring / Spring Boot 的初学者,我查看了一些 Spring / Spring Boot 项目并意识到,在其中一些项目中,DI 是使用构造函数应用的,如下所示:
@RestController
@RequestMapping("/api/v1/core")
public class DemoController {
private final SalaryService salaryService;
private final EmployeeService employeeService;
public DemoController(SalaryService salaryService, EmployeeService employeeService) {
this.salaryService = salaryService;
this.employeeService = employeeService;
}
}
但是,在某些项目中,DI 是通过注释应用的,并且代码被简化了。是否可以在 Spring 或 Spring Boot 中使用注释并通过删除构造函数来简化代码?如果是这样,是否适用于 Service、Repository 和 Controller?
【问题讨论】:
-
你展示的方式,没有Autowired注解,那么你是如何应用DI的呢?您也可以自动装配变量本身,这不必在构造函数上
-
@Stultuske 在组件中(例如 RestController),ctor 上的 Autowired 注解完全是可选的。
-
@Stultuske 为什么不发布答案而不是文字?
-
@Maxwell 答案也是“只是文字”。其次,我的意思是评论,而不是答案
-
@Maxwell 好吧,考虑一下。您已经告诉 Spring 它需要通过使用
@RestController注释类来实例化该类。您的班级恰好有 1 个构造函数。 Spring 足够聪明,可以看出这里没有歧义;如果它想实例化这个类,它必然必须使用那个构造函数。在构造函数中添加@Autowired对 Spring 没有帮助,它只是额外的噪音。如果你有 2 个构造函数并且你想指示 Spring 选择哪个构造函数,我相信你可以在构造函数上使用@Autowired,但我从来不需要那个功能。
标签: java spring spring-boot jpa dependency-injection