gpt4 book ai didi

java - 是否存在可以接受使用构造函数调用创建的 Spring bean 的用例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:23 24 4
gpt4 key购买 nike

我是 Spring 的新手,我使用 Craig Walls 的“Spring in Action”(第四版)进行学习。兴趣不仅在于如何编写有效的代码,还在于正确使用 Spring 的原则。

关于 list 5.6 第 142 页的以下代码:

public class HomeControllerTest {

@Test
public void testHomePage() throws Exception {
HomeController controller = new HomeController();
MockMvc mockMvc = standaloneSetup(controller).build();
mockMvc.perform(get("/")).andExpect(view().name("home"));
}
}

我的问题是由以下想法产生的:

  1. 一般的理解是,Spring 使用依赖注入(inject)作为一种减少对象依赖管理开销、增加模块化、简化测试和代码重用的方法。但是,这不是暗示bean必须由容器来创建和管理吗?自从我开始阅读这个主题以来,我记住的第一个细节是 new 永远不应该出现在 DI 之后的一段写得很好的代码中。
  2. 如果我们想测试一个 Stateful bean,这会是一个解决方案吗?我的意思是,如果在同一个实例上运行多个独立测试,每个测试都测试 bean 的相同状态。尽管我发现有一个合适的注释可以执行此操作 (@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD))。
  3. 是否还有其他用例难以或无法通过其他方式解决(使用 new 除外)?

更“一字不漏”的实现将使用 @ContextConfiguration 来指定 ApplicationContext

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = WebConfig.class)
@WebAppConfiguration
public class HomeControllerTest {

@Autowired
HomeController controller;

@Test
public void testHomePage() throws Exception {
MockMvc mockMvc = standaloneSetup(controller).build();
mockMvc.perform(get("/")).andExpect(view().name("home"));
}
}

最佳答案

  1. 是的,您不应该使用 new 在生产代码中创建 Spring bean 实例(否则它们不再是 Spring bean)。但 DI 的全部意义在于让您在单元测试中创建并手动注入(inject)具有虚假依赖项的对象。所以这里的测试代码完全没问题。

  2. 是的,每个单元测试都可以自由创建自己的 bean 实例并按照需要的方式填充它。不过,有状态的 bean 非常罕见。他们通常是无国籍的。

  3. 另外一个使用new创建Spring bean的地方就是在配置类的@Bean注解方法中。这些方法的全部意义在于创建和初始化 Spring bean,然后由 Spring 使用和注入(inject)。但同样,在单元测试中使用 new 绝对没问题,而且是正确的做法。

关于java - 是否存在可以接受使用构造函数调用创建的 Spring bean 的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41897230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com