何时在Spring中使用自动装配

时间:2012-10-16 17:53:07

标签: java spring

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

  

在大多数情况下,答案是否应该使用   自动装配绝对是“不!”自动装配可以节省您的时间   应用程序,但在许多情况下,它导致不良做法,并且   在大型应用程序中不灵活。使用byName似乎很好   想法,但它可能会导致你给你的类人工财产   名称,以便您可以利用自动装配功能。   Spring背后的整个想法是你可以创建你的类如何   你喜欢并让Spring为你工作,而不是相反...

     

...对于任何重要的应用程序,完全避开自动装配   成本。

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

现在处理大多数事情的一个小例子是:

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

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

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

4 个答案:

答案 0 :(得分:24)

我相信这里有两件事情混乱。本章中“自动装配”的含义是标记用于自动检测和注入依赖关系的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;
    }
}

如果你定义了一个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,如果需要,还可以让您更具体(例如使用nametype属性)。

答案 2 :(得分:2)

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

如果你没有这种情况,我认为没问题。

答案 3 :(得分:0)

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

我很震惊,作者说,几年前我在一个非常大的春季2.5项目上做了上述事情。 (当时注释支持在JBoss中不起作用)