Подтвердить что ты не робот

Есть ли способ переопределить bean, обнаруженный при проверке компонентов?

У меня есть класс конфигурации java, предоставляющий fooBean напрямую и barBean путем сканирования компонентов.

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

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

и я хочу повторно использовать его в тестовых случаях, и мне нужно заменить beans на mocks:

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

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

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

(здесь нет смысла повторно использовать Config, но в реальной жизни у меня 1000 beans, и мне нужно издеваться над несколькими)

Здесь 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).

4b9b3361

Ответ 1

Попробуйте пропустить ненужный beans:

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

Ответ 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 должно быть таким же.