我正在阅读Pro Spring3这本书。它有一段确实让我感到困惑。该段是关于春季自动装配的。这是节选:
在大多数情况下,是否应该使用自动装配的问题的答案肯定是“不!”。自动装配可以在小型应用程序中节省时间,但在许多情况下,这会导致不良做法,并且在大型应用程序中不灵活。使用byName似乎是个好主意,但它可能会导致您为类提供人为的属性名称,以便可以利用自动装配功能。Spring的整个想法是,您可以按自己的喜好创建类并让Spring为您工作,而不是反过来… …对于任何非平凡的应用,请不惜一切代价避免自动接线。
在大多数情况下,是否应该使用自动装配的问题的答案肯定是“不!”。自动装配可以在小型应用程序中节省时间,但在许多情况下,这会导致不良做法,并且在大型应用程序中不灵活。使用byName似乎是个好主意,但它可能会导致您为类提供人为的属性名称,以便可以利用自动装配功能。Spring的整个想法是,您可以按自己的喜好创建类并让Spring为您工作,而不是反过来…
…对于任何非平凡的应用,请不惜一切代价避免自动接线。
我一直在我创建的应用程序中使用@Autowired标记。有人可以解释它有什么问题吗,我应该用什么代替呢?
我现在如何处理大多数事情的一个迷你示例是:
@Service("snippetService") public class SnippetService { @Autowired private TestService testService; public Snippet getSnippet() { return testService.getSnippet(); } }
是否使用这种“错误”的自动接线方式,或者我缺少某些东西?
我相信这里有两件事令人困惑。在本章中,“自动装配”的含义是标记Bean,以自动检测和注入依赖项。这可以通过设置“ autowire” bean属性来实现。
实际上,这与@Autowired在显式指示字段或设置器的位置进行依赖注入相反。
@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"/>
TestService在这种情况下,spring将通过调用setTestService setter 尝试注入匹配类型的bean 。即使您没有使用@Autowired。这确实很危险,因为某些二传手可能并不意味着在春季被召唤。
TestService
如果设置自动装配=“否”,什么都不会被注入,除非标记,以便有@Autowired,@Resource,@Inject。
@Resource
@Inject