Java Spring中的自动连接setter而不是自动连接实例变量

Java Spring中的自动连接setter而不是自动连接实例变量,java,spring,design-patterns,inversion-of-control,Java,Spring,Design Patterns,Inversion Of Control,我是使用Spring的Java团队的初级工程师。我们已经被指导自动连接实例变量的设置器,而不是自动连接实际的实例变量。我有点困惑,我们为什么这样做,这样做的好处是什么,以及以这种方式处理依赖关系管理的可能缺点是什么 我的一些观察(实际上在Java EE中工作了3年): 优点: 您可以在setters方法中添加一些额外的验证或逻辑 对于某些特殊情况,可以避免在junit测试中使用反射 可以重写setter,以便可以注入其他内容 缺点: 在大多数情况下,这种验证是不必要的,因为您正在注入另一个

我是使用Spring的Java团队的初级工程师。我们已经被指导自动连接实例变量的设置器,而不是自动连接实际的实例变量。我有点困惑,我们为什么这样做,这样做的好处是什么,以及以这种方式处理依赖关系管理的可能缺点是什么

我的一些观察(实际上在Java EE中工作了3年):

优点:

  • 您可以在setters方法中添加一些额外的验证或逻辑
  • 对于某些特殊情况,可以避免在junit测试中使用反射
  • 可以重写setter,以便可以注入其他内容
缺点:

  • 在大多数情况下,这种验证是不必要的,因为您正在注入另一个服务
  • 在代码中必须有很多无用的setter和getter。例如,在我的代码中,每个服务通常使用大约5个DAO类,所以这是10个额外的方法,这给了我大约60行额外的代码
  • 大多数情况下,在应用程序初始化之后,您不需要注入另一个DAO或服务
  • setter/getter不能在以后使用,因为在spring中,您处理的是接口,而不是具体的实现。在接口上使用setter和getter是一种不好的做法

我个人更喜欢实例变量或构造函数注入。但这取决于服务。我不会说使用setter更好。它只是有不同的目的。

您可以在这里找到问题的答案: