Java 何时在Spring中使用自动布线

Java 何时在Spring中使用自动布线,java,spring,Java,Spring,我正在读这本书。它有一段话让我很困惑。这一段是关于春天的自动布线。以下是摘录: 在大多数情况下,您是否应该使用 自动布线绝对是“不!”自动布线可以节省您的时间 应用程序,但在许多情况下,它会导致错误的做法,并且 在大型应用中不灵活。使用别名似乎是一个好方法 想法,但它可能会导致你给你的类人造财产 名称,以便您可以利用自动布线功能。 Spring背后的全部思想是,您可以如何创建类 你喜欢春天为你工作,而不是相反 。。。对于任何非平凡的应用,都要避免自动布线 成本 我一直在我创建的应用程序中使用@A

我正在读这本书。它有一段话让我很困惑。这一段是关于春天的自动布线。以下是摘录:

在大多数情况下,您是否应该使用 自动布线绝对是“不!”自动布线可以节省您的时间 应用程序,但在许多情况下,它会导致错误的做法,并且 在大型应用中不灵活。使用别名似乎是一个好方法 想法,但它可能会导致你给你的类人造财产 名称,以便您可以利用自动布线功能。 Spring背后的全部思想是,您可以如何创建类 你喜欢春天为你工作,而不是相反

。。。对于任何非平凡的应用,都要避免自动布线 成本

我一直在我创建的应用程序中使用@Autowired标记。有人能解释一下它有什么问题,我应该用什么来代替吗

我现在处理大多数事情的一个小例子是:

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }
}    

像这样使用自动布线是“错误的”还是我遗漏了什么?

您所拥有的并没有什么问题,特别是如果您从一个
TestService
的实现开始。正如Johan所提到的,最好使用
@javax.annotation.Resource
,如果需要,它还允许您更加具体(例如使用
名称
类型
属性)。

我在这里看到的唯一问题是您稍微失去了控制。例如,假设您的应用程序配置中有两个或多个
TestService
实例,并且希望使用其中一个。拥有
Autowire
make比使用config-XML为您注入更为棘手。这就是您的书试图指出的,即在此类需求更频繁的大型应用程序中,它变得更加困难/棘手


如果你没有这样的情况,我想没关系。

我认为这里有两件事是混淆的。本章中“自动连接”的意思是为自动检测和注入依赖项标记bean。这可以通过设置“autowire”bean属性来实现

事实上,这与使用
@Autowired
相反,在这里您明确地指示字段或setter以进行依赖项注入

请看这里:

要解释它,假设你有

public class SnippetService {

    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }

    public void setTestService(TestService testService) {
      this.testService = testService;
    }
}
如果您定义了一个bean:

<bean class="mypackage.SnippetService" autowire="byType"/>

spring将通过调用setTestService setter尝试注入匹配类型的bean,在本例中为
TestService
。即使您没有使用
@Autowired
。这确实是危险的,因为有些二传手可能不应该被spring调用


如果设置autowire=“否”,则除非使用
@Autowired
@Resource
@Inject
@Inject

标记,否则不会注入任何内容,如果您执行基于构造函数的自动连线,则通过XML进行autowire是完全安全和有用的,特别是如果您使协作者成为私有最终用户


几年前,当我在一个非常大的Spring2.5项目上做上述工作时,作者说的话让我有点震惊。(当时注释支持在JBoss中不起作用)

不鼓励使用
@Qualifier
而支持
@Resource
,因为Spring IoC容器实现了JSR 250,这是否说明始终使用@Resource而不是@Autowired?编辑:显然这取决于(令人惊讶!)有趣的论坛帖子,看起来肯定是这样,特别是如果你能坚持使用字段或setter方法注入的话。我从来没有遇到过@Resource注释。感谢您提到它并解释它的用法。但是在这种情况下,您要做的是使用@Qualifier注释来指示您想要哪些bean。我没有说您不能这样做。我的意思是:配置文件是为了在外部注入和使用依赖项。通过使用
注释
,我们将其引入到实现类本身中。在更大的应用中,这变得更困难/更棘手。我认为这是主观的。我发现不必维护庞大而繁琐的XML文件要困难得多。如果需要一个特定接口的新实现,我必须更改XML和类;使用自动布线,我只需替换类。少一点变化,少一个可能的错误。这更有意义。我刚刚遇到了这种情况。我想从属性文件中读取值并将它们注入bean。在我的应用程序启动时,我唯一能想到的方法是用XML连接bean(并注入属性)。我最终使用了“byName”属性(因为bean也被标记为@Component),然后在将bean注入另一个类时使用@Autowired@Qualifier(“nameIChose”)。这是我编写的唯一一个用XML连接的bean。非常感谢您的澄清!我发现,在我让一个工厂bean生成另一个bean(其实现类名在系统属性中描述,因此我无法用XML定义所有连接)的情况下,自动连接非常有用。但我通常更喜欢让我的接线清晰明了;如果事情明确的话,它大大简化了长期维护。我不是Spring用户,但我熟悉Guice和CDI。这些框架基本上只做自动布线;对于每个带注释的注入站点,框架将根据类型和存在的任何限定符找到它可以注入的内容,然后注入它。人们已经使用这种方法构建了相当大的应用程序;我在做一个。我不相信他们遇到了Spring autowire phobes预言的问题。不过,有一点需要注意:这些框架不会在
autowire=“byType”
的意义上进行自动连接。如果,正如@mrembisz所说,文章特别警告了这一点,那么Guice和CDI的经验就不相关了。