何时在Spring中使用自动assembly

我正在阅读Pro Spring 3一书。 它有一段让我很困惑的段落。 这一段是关于spring的自动assembly。 这是一段摘录:

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

…对于任何重要的应用,不惜一切代价避免自动assembly。

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

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

@Service("snippetService") public class SnippetService { @Autowired private TestService testService; public Snippet getSnippet() { return testService.getSnippet(); } } 

使用像这样“错误”的自动assembly还是我错过了什么?

我相信这里有两件事情混乱。 本章中“自动assembly”的含义是标记bean,用于自动检测和注入依赖关系。 这可以通过设置“autowire”bean属性来实现。

这实际上与使用@Autowired相反,其中您明确指出dependency injection的字段或setter。

看看这里: 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:

  

在这种情况下,spring会尝试通过调用setTestService setter来注入匹配类型的bean, TestService 。 即使你没有使用@Autowired 。 这确实是危险的,因为一些人可能不会被spring召唤。

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

你拥有的东西没有任何问题,特别是如果你开始使用TestService一个实现。 正如Johan所提到的,最好使用@javax.annotation.Resource ,如果需要,它还允许您更具体(例如使用nametype属性)。

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

如果你没有这种情况,我认为很好。

如果您使用基于构造函数的自动assembly,则通过XML自动assembly是完全安全且有用的,特别是如果您使协作者成为私人决赛。

我很震惊,作者说,几年前我在一个非常大的弹簧2.5项目上完成了上述工作。 (当时注释支持在JBoss中不起作用)