【问题标题】:Is there any way to override a bean discovered by component scan?有没有办法覆盖组件扫描发现的 bean?
【发布时间】:2013-04-05 01:36:50
【问题描述】:

我有一个java配置类直接提供fooBean,通过组件扫描提供barBean。

@Configuration
@ComponentScan(basePackages = { "com.blah" })
public class Config {

    @Bean
    public FooBean fooBean {
        return new FooBean();
    }
}

我想在测试用例中重用它,我需要用模拟替换bean:

@Configuration
@Import(Config.class)
public class TestConfig {

    @Bean
    public FooBean fooBean {
        return new FooBeanMock();
    }

    @Bean
    public BarBean barBean {
        return new BarBeanMock();
    }
}

(这里重用 Config 没有多大意义,但在现实生活中我有 1000 个 Bean,我只需要模拟几个)

这里 fooBean 被覆盖,但 barBean 没有。

Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML.

还有一个官方问题: https://jira.springsource.org/browse/SPR-9682

是否有人知道任何解决方法来覆盖组件扫描发现的 bean?

考虑到 bean 是遗留代码,无法修改,并且没有设置器用于其依赖项(私有属性 + @Resource)。

【问题讨论】:

    标签: spring dependency-injection spring-3 spring-annotations


    【解决方案1】:

    尝试跳过不必要的 bean:

    @ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class}))
    

    【讨论】:

    • 我无法在主配置中跳过它们。因为我需要 bean,而且我看不到任何实例化该 bean 的可能性,否则是因为“考虑到 bean 是遗留代码并且无法修改,并且它的依赖项没有设置器(私有属性 + @Resource)。 ”。在导入主配置的测试配置上,它没有任何意义,因为无论如何都会执行来自导入的主配置的comp扫描。
    • 也许你可以将你的主要配置分成两部分:1)组件扫描 2)其他一切。然后在您的测试配置中只导入第二个。因此,您将可以覆盖测试的组件扫描设置。
    【解决方案2】:

    是的,您可以覆盖组件扫描发现的 bean。我在测试用例中这样做。我使用 XML 配置,但我认为使用 Java 配置会非常相似。

    spring.xml:

     <context:component-scan base-package="cz.backend"/>
    

    MyBeanImpl.java

    @Component("myBean")
    public class MyBeanImpl implements MyBean {
       //Something
    }
    

    在我的测试文件夹中:

    spring-test.xml:

    <import resource="classpath:/spring.xml"/>
    <bean id="myBean" class="cz.backend.MyBeanTestMock"/>
    

    MyBeanTestMock.java:

    public class MyBeanTestMock implements MyBean {
        //Something
    }
    

    覆盖 bean 的名称必须相同。

    【讨论】:

    • 问题出在组件扫描和显式 xml 配置的组合中。
    • 官方bug中可以看到,4.2版本已经解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2018-10-05
    相关资源
    最近更新 更多