gpt4 book ai didi

java - Spring,基于注解,覆盖组件

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

当我使用 XML 设置 Spring 时,可以覆盖稍后加载的 XML 文件中的组件定义。它对测试非常有用——我创建了默认配置集,然后用附加测试配置加载它,用特殊组件( stub 、模拟等)替换一些组件。现在我开始迁移到基于注释的配置,这会导致一些问题。

使用注解的直接方法是使用@Component自动发现包

所以我有

@Configuration
@ComponentScan({"some.pack1", "some.pack2"})
public class ProductConfig{}

当 @配置 @Import({ProductConfig.class}) @ComponentScan({"test.pack"}) 公共(public)类 TestConfig{}

但是如果我尝试重写test.pack中的组件会引起冲突

我能做什么?

经过一些调查,其中有 3 个问题的答案

  1. 最差——我可以在 ComponentScan 上使用@Filter——这是最差的方式,
    • 我不能导入现有的配置(可以有一些额外的 beans)
    • 我必须重新扫描所有组件,并明确定义一组过滤器
  2. 我可以使用@Profile 和 activeProfiles - 它更好,但更复杂、隐含,但是
    • 这意味着我必须在产品类别中知道它们可以在某些测试中被禁用
  3. 不要在重写配置上使用@ComponentScan,而是使用@Bean 代替它
    • 它可能在测试配置上很好,但这意味着我失去了使用@Component 注释的能力
  4. 在上下文中使用 setParent - 它运行良好,但是
    • 它是对 ApplicationContext 实现的显式操作,而不是在接口(interface)上
    • 如果覆盖服务对覆盖配置中的某些组件具有@Autwire 依赖性,则设置起来并不难——需要手动注册和刷新

覆盖配置的最佳和标准方法是什么???当我使用基于 XML 时,这不是问题...

最佳答案

@profile 在为您的服务/代码实现测试策略时起着至关重要的作用。

例如,在开发中,您可能有:

public interface DataSource{
public String getHost();
}

默认实现是

@Component
@Profile("Prod")
public class DevDataSource implements DataSource {
public String getHost(){
// return actual value
}

以及组件测试的实现(Fake impl)

@Component
@Profile("test")
public class StubbyDataSource implements DataSource {
public String getHost(){
return "some-host"; // return mocked data
}

现在您可以在这里编写一个测试,它可以作为集成测试单元测试组件测试 ( https://martinfowler.com/bliki/ComponentTest.html )

那样的话,您的测试策略会更加优雅、简洁且易于维护。 只需更改配置文件,相同的测试就可以指向不同的环境(真实的或虚假的)。

关于java - Spring,基于注解,覆盖组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43662594/

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