何时在Spring中使用自动装配

geo*_*ydv 29 java spring

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

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

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

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

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

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }
}    
Run Code Online (Sandbox Code Playgroud)

使用像这样"错误"的自动装配还是我错过了什么?

mre*_*isz 25

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

事实上,这与使用@Autowired明确表示依赖注入的字段或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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你定义了一个bean:

<bean class="mypackage.SnippetService" autowire="byType"/>
Run Code Online (Sandbox Code Playgroud)

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

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