我正在阅读这本书Pro Spring 3。它有一段让我很困惑的段落。这一段是关于春天的自动装配。这是一段摘录:
在大多数情况下,答案是否应该使用 自动装配绝对是“不!”自动装配可以节省您的时间 应用程序,但在许多情况下,它导致不良做法,并且 在大型应用程序中不灵活。使用byName似乎很好 想法,但它可能会导致你给你的类人工财产 名称,以便您可以利用自动装配功能。 Spring背后的整个想法是你可以创建你的类如何 你喜欢并让Spring为你工作,而不是相反...
...对于任何重要的应用程序,完全避开自动装配 成本。
我一直在我创建的应用程序中使用@Autowired标记。有人可以解释它的错误以及我应该使用什么吗?
现在处理大多数事情的一个小例子是:
@Service("snippetService")
public class SnippetService {
@Autowired
private TestService testService;
public Snippet getSnippet() {
return testService.getSnippet();
}
}
使用像这样“错误”的自动装配还是我错过了什么?
答案 0 :(得分:24)
我相信这里有两件事情混乱。本章中“自动装配”的含义是标记用于自动检测和注入依赖关系的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
。这确实是危险的,因为一些人可能不会被春天召唤。
如果您设置了autowire =“no”,则除非使用@Autowired
,@Resource
,@Inject
进行标记,否则不会注入任何内容。
答案 1 :(得分:3)
你所拥有的东西没有任何问题,特别是如果你开始使用TestService
的一个实现。正如Johan所提到的,最好使用@javax.annotation.Resource
,如果需要,还可以让您更具体(例如使用name
或type
属性)。
答案 2 :(得分:2)
我在这里看到的唯一问题是你失控了一点。例如,假设您的应用配置中有两个或更多TestService
个实例,并且您想要使用其中一个实例。让Autowire
制作比使用配置XML为您注入更棘手。这就是你的书试图指出的内容,即在大型应用程序中,这种需求更加频繁,变得困难/棘手。
如果你没有这种情况,我认为没问题。
答案 3 :(得分:0)
如果您使用基于构造函数的自动装配,通过XML自动装配是完全安全且有用的,特别是如果您使协作者成为私人决赛。
我很震惊,作者说,几年前我在一个非常大的春季2.5项目上做了上述事情。 (当时注释支持在JBoss中不起作用)