30

我正在读这本书Pro Spring 3。它有一段让我很困惑。这一段是关于春天的自动装配。这是一段摘录:

在大多数情况下,是否应该使用自动装配这个问题的答案肯定是“不!” 自动装配可以在小型应用程序中节省您的时间,但在许多情况下,它会导致不良做法并且在大型应用程序中不灵活。使用 byName 似乎是一个好主意,但它可能会导致您为类提供人工属性名称,以便您可以利用自动装配功能。Spring 背后的整个想法是,您可以按照自己喜欢的方式创建类并让 Spring 为您工作,而不是相反......

...对于任何重要的应用程序,不惜一切代价避开自动装配。

我一直在我创建的应用程序中使用@Autowired 标签。有人可以解释它有什么问题以及我应该改用什么吗?

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

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

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

像这样“错误”地使用自动装配还是我错过了什么?

4

4 回答 4

25

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

这实际上与使用@Autowired明确指示字段或设置器进行依赖注入的位置相反。

看看这里:http ://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-autowire 。

为了解释它,假设你有

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 将尝试注入匹配类型的 bean,TestService在这种情况下,通过调用 setTestService setter。即使你没有使用@Autowired. 这确实很危险,因为某些 setter 可能不应该被 spring 调用。

@Autowired如果您设置 autowire="no",除非用, @Resource,标记,否则不会注入任何内容@Inject

于 2012-10-16T18:06:51.563 回答
3

你所拥有的没有任何问题,特别是如果你开始使用一种实现方式TestService。正如 Johan 所提到的,最好使用@javax.annotation.Resourcewhich 也可以让您在需要时更具体(例如使用nameortype属性)。

于 2012-10-16T18:00:54.403 回答
2

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

如果你没有这种情况,我认为没问题。

于 2012-10-16T18:04:14.510 回答
0

如果您执行基于构造函数的自动装配,特别是如果您将协作者设为私有 final,则通过 XML 进行自动装配是完全安全且有用的。

几年前,当我在一个非常大的 spring 2.5 项目中执行上述操作时,作者说我很震惊。(当时注释支持在 JBoss 中不起作用)

于 2012-10-17T19:20:57.360 回答