有没有办法覆盖组件扫描发现的bean?

mmo*_*sen 14 spring dependency-injection spring-annotations spring-3

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

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

    @Bean
    public FooBean fooBean {
        return new FooBean();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    @Bean
    public BarBean barBean {
        return new BarBeanMock();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这里fooBean被覆盖,但不是barBean.

Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML.
Run Code Online (Sandbox Code Playgroud)

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

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

考虑到bean是遗留代码并且无法修改,并且其依赖项没有setter(私有属性+ @Resource).

Mak*_*das 6

尝试跳过不必要的bean:

@ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class}))
Run Code Online (Sandbox Code Playgroud)