一尘不染

何时在Spring中使用自动装配

java

我正在阅读Pro Spring3这本书。它有一段确实让我感到困惑。该段是关于春季自动装配的。这是节选:

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

…对于任何非平凡的应用,请不惜一切代价避免自动接线。

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

我现在如何处理大多数事情的一个迷你示例是:

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

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

是否使用这种“错误”的自动接线方式,或者我缺少某些东西?


阅读 250

收藏
2020-12-03

共1个答案

一尘不染

我相信这里有两件事令人困惑。在本章中,“自动装配”的含义是标记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"/>

TestService在这种情况下,spring将通过调用setTestService setter 尝试注入匹配类型的bean
。即使您没有使用@Autowired。这确实很危险,因为某些二传手可能并不意味着在春季被召唤。

如果设置自动装配=“否”,什么都不会被注入,除非标记,以便有@Autowired@Resource@Inject

2020-12-03