当前位置: 首页 > 面试题库 >

何时在Spring中使用自动装配

暨修洁
2023-03-14
问题内容

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

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

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

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

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

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

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

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


问题答案:

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



 类似资料:
  • 问题内容: 我有一个需要在类中自动装配的bean 。 但是当我尝试时@Autowire Item ,出现以下异常。 如何在Spring中自动装配通用类型? 问题答案: 一个简单的解决方案是升级到Spring 4.0,因为它将自动将泛型视为的一种形式,如下所示: 实际上,你甚至可以在插入列表时自动嵌套嵌套的泛型,如下所示: 如何运作? 新ResolvableType类提供了实际使用泛型类型的逻辑。你

  • 问题内容: 我正在使用Spring 3.1.4.RELEASE和Mockito 1.9.5。在我的Spring班上,我有: 从我目前设置的JUnit测试中可以看到: 我想为“ defaultUrl”字段模拟一个值。请注意,我不想模拟其他字段的值-我想保留它们的值,只保留“ defaultUrl”字段。另外请注意,我的班级中没有明确的“ setter”方法(例如),并且我不想仅为测试目的而创建任何方

  • 主要内容:Spring 自动装配,自动装配规则,示例我们把 Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为“装配”。 Spring 的 IOC 容器虽然功能强大,但它本身不过只是一个空壳而已,它自己并不能独自完成装配工作。需要我们主动将 Bean 放进去,并告诉它 Bean 和 Bean 之间的依赖关系,它才能按照我们的要求完成装配工作。 在前面的学习中,我们都是在 XML 配置中通过 <constructor-arg>和 <

  • 我是Spring boot(1.1.8版,4.0.7版)的新手,需要修复一个单元测试。被测试的类使用另一个具有简单自动连线配置bean的类。bean的类主要查找一组键值对,其中键具有特定前缀。使用src/main/resources中的yaml文件,代码本身工作得非常好。然而,当我运行测试用例时,这个bean是空的。如何让测试用例读取src/test/resources目录中的yaml文件?

  • 问题内容: 我有一个要测试的Spring组件,该组件具有autowired属性,出于单元测试的目的,我需要更改该属性。问题是,该类在post- construct方法内部使用了自动装配的组件,因此在实际使用它之前,我无法替换它(即通过ReflectionTestUtils)。 我该怎么办? 这是我要测试的课程: 这是一个测试用例的基础: 在调用postconstruct方法之前,是否可以用其他方法

  • 问题内容: 我使用JUnit测试以下DAO: 如你所见,sessionFactory是使用Spring自动接线的。当我运行测试时,sessionFactory保持为空,并且出现空指针异常。 这是Spring中的sessionFactory配置: 怎么了?我如何也可以为单元测试启用自动装配? 更新:我不知道这是否是运行JUnit测试的唯一方法,但是请注意,我正在Eclipse中运行,右键单击测试文件