【问题标题】:Why people uses @Autowired for constructor injection为什么人们使用@Autowired 进行构造函数注入
【发布时间】:2021-08-29 20:00:32
【问题描述】:

我见过很多人在构造函数中使用@Autowired注解来注入如下所示的依赖项

@Service
public class Employee {

 private EmployeeService employeeService;
 
 @Autowired
 public Employee(EmployeeService employeeService) {
   this.employeeService = employeeService;
 }
 :
 :
}

据我所知,现在 Spring 是如此先进,即使没有 @Autowired,Spring 构造函数/设置器 DI 也可以工作,如下所示

@Service
public class Employee {

 private EmployeeService employeeService;

 public Employee(EmployeeService employeeService) {
   this.employeeService = employeeService;
 }
 :
 :
}

想知道为什么人们用@Autowired注解来注解构造函数以注入依赖项。

有人可以帮我解决这个问题吗

【问题讨论】:

  • 你可以有多个构造函数,如果没有@Autowired,Spring 将不知道使用哪个构造函数
  • 因为 10 个开发者中有 8 个的复制/粘贴心态。我的工作中有大约 20 名开发人员,其中大约 16 人对 Spring 的内部工作原理知之甚少。
  • @SvetlinZarev 因此,如果我们有多个构造函数,我们应该选择最有用的一个并使用@Autowired 进行注释,以便在其他地方通过 DI 注入对吧?现在我们真的需要在 Spring 上下文中拥有多个构造函数吗
  • 请注意,有多个构造函数是not a good practice

标签: java spring dependency-injection autowired


【解决方案1】:

这样做没有技术原因(除非您有多个构造函数等)。最可能的原因是,人们已经学会了使用它,当时Spring不支持构造函数的自动检测并且仍然需要它,俗话说,旧习惯难改。另外,如果您搜索任何示例,您仍然会发现很多教程,其中使用了注释,所以这是另一个原因。这与 Spring Data 接口上的 @Repository 注释相同。那里的注释完全是错误的,但是这个网站上有很多问题,人们在他们的代码中添加了这个。

【讨论】:

  • 1+ for @Repository 和接口!多少次你可以向人们回答和解释同样的事情,他们仍然使用它,这太荒谬了。
【解决方案2】:

是的,你是对的 - 你不需要在 DI 中使用注解 @Autowired 构造函数。 我认为有几个原因:

  • 开发者不知道这不是必需的
  • 开发者使用注解强调它是 DI
  • 程序员不信任 Spring 并希望确保 DI 正常工作
  • 应用程序是用较低的 Spring 编写并升级到更新的 - 注释是它的工件

【讨论】:

    【解决方案3】:

    就我个人而言,我使用@Autowired注解只是为了增强代码的可读性,以便其他开发人员可以更轻松地阅读和理解代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多