Java Spring@Autowired用法

Java Spring@Autowired用法,java,spring,autowired,Java,Spring,Autowired,在Spring即将上线的类中使用@Autowired的优缺点是什么 为了澄清,我专门讨论的是@Autowired注释,而不是XML中的自动连接 我可能只是不明白,但对我来说,这几乎像是一种反模式——您的类开始意识到它们与DI框架绑定,而不仅仅是POJO。也许我是个贪吃惩罚的人,但我喜欢bean的外部XML配置,我喜欢显式连接,所以我确切地知道什么是连接的地方。对于我来说,这里是我喜欢/不喜欢Spring和自动连接的地方 优点: 自动连接摆脱了讨厌的XML配置 更易于使用的注释允许您直接使用字段

在Spring即将上线的类中使用@Autowired的优缺点是什么

为了澄清,我专门讨论的是@Autowired注释,而不是XML中的自动连接


我可能只是不明白,但对我来说,这几乎像是一种反模式——您的类开始意识到它们与DI框架绑定,而不仅仅是POJO。也许我是个贪吃惩罚的人,但我喜欢bean的外部XML配置,我喜欢显式连接,所以我确切地知道什么是连接的地方。

对于我来说,这里是我喜欢/不喜欢Spring和自动连接的地方

优点:

  • 自动连接摆脱了讨厌的XML配置
  • 更易于使用的注释允许您直接使用字段、setter方法或构造函数进行注入。还允许您对注入的bean进行注释和“限定”
缺点:

  • 使用自动连接和注释会使您依赖于Spring库,在Spring库中,您可以选择使用或不使用Spring运行XML配置。正如您所说,您将被绑定到DI框架
  • 同时,我喜欢能够“限定”bean,对我来说,这使得代码非常混乱。如果您需要在多个地方注入相同的bean,我已经看到相同的字符串名称在所有地方重复。在我看来,这似乎有可能出错
我已经开始几乎完全在工作中使用自动布线,因为我们非常依赖Spring集成,所以依赖性问题是没有意义的。我在一个SpringMVC项目中工作,该项目广泛使用自动布线,我有点难以理解


我认为自动布线是一种后天养成的嗜好,一旦你习惯了它,你就会意识到它是多么强大、简单,而且比起XML配置来,它是多么令人头痛。

很长一段时间以来,我相信拥有一个“集中的、声明性的、配置”是有价值的,就像我们过去使用的XML文件一样。然后我意识到文件中的大部分内容都不是配置——在开发之后,它从未在任何地方发生过更改。然后我意识到“集中式”只有在相当小的系统中才有价值——只有在小的系统中,您才能从整体上浏览配置文件。当相同的“布线”大部分被代码中的依赖项复制时,理解作为一个整体的布线的真正价值是什么?所以我唯一保留的是元数据(注释),它仍然是一种声明性的。这些数据在运行时永远不会更改,也永远不会是有人会动态更改的“配置”数据,因此我认为将其保留在代码中是很好的

我尽可能使用全自动接线。我喜欢它。除非受到枪口威胁,否则我不会回到旧式的春天。我选择完全
@Autowired
的原因随着时间的推移而改变

现在,我认为使用自动布线最重要的原因是,系统中要跟踪的抽象少了一个。“豆名”实际上已经消失了。事实证明,bean名称只存在于xml中。因此,一个完整的抽象间接层(您可以将bean名称“foo”连接到bean“bar”)消失了。现在,我将“Foo”接口直接连接到bean中,实现由运行时概要文件选择。这允许我在跟踪依赖项和实现时使用代码。当我在代码中看到一个自动连接的依赖项时,我可以在IDE中按下“go to implementation”键,然后出现已知实现的列表。在大多数情况下,只有一个实现,我直接进入这个类。没有比这更简单的了,我总是确切地知道正在使用什么样的实现(我声称,与之相反的是,xml连接更接近事实——你的视角如何变化真有趣!)

现在你可以说它只是一个非常简单的层,但是我们添加到系统中的每一层抽象都会增加复杂性。我真的不认为xml为我使用过的任何系统增加了任何真正的价值

我使用过的大多数系统只有一种生产运行时环境的配置。可能还有其他用于测试等的配置

我要说的是,完整的自动连接是spring的RubyonRails:它包含了一个概念,即大多数用例都遵循一种正常和常见的使用模式。使用XML配置,您可以允许大量一致/不一致的配置使用,这些使用可能是/可能不是预期的。我已经看到了太多的xml配置出现了不一致的情况——它会和代码一起重构吗?我想不是。这些变化是有原因的吗?通常不会

我们几乎不在配置中使用限定符,而是找到了其他方法来解决这些情况。这是我们遇到的一个明显的“缺点”:我们稍微改变了编码方式,使其与自动连接的交互更加顺畅:客户存储库不再实现通用的
存储库
接口,而是创建了一个扩展
存储库
的接口
CustomerRepository
。有时在子类化方面也有一两个技巧。但它通常只是为我们指明了更强大的打字方向,我发现这几乎总是一个更好的解决方案

但是,是的,您将绑定到一种特定风格的DI,而spring主要是这样做的。我们甚至不再公开依赖项的设置器(因此你可以说我们在封装/信息隐藏部门是+1),我们的系统中仍然有一些xml,但xml基本上只包含异常。完全自动连接与xml很好地集成

我们现在只需要将
@组件
@自动连线
和其他组件包含在JSR中(比如),这样我们就不必与spring绑定。这就是过去发生的事情的方式(java.util.concurrent
    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;