2013-04-12 5 views
11

필자는 fooBean을 직접 제공하고 컴포넌트 스캔을 통해 barBean을 제공하는 java 구성 클래스를 보유하고 있습니다.구성 요소 검사로 발견 된 Bean을 재정의하는 방법이 있습니까?

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

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

와 나는 시험의 경우 재사용 할 그리고 난 모의 객체와 콩을 교체해야합니다 : 그것은 많은 의미가 구성을 재사용하지 않습니다

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

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

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

을 (여기지만, 현실에서 나는 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. 

이 공식 문제도있다 : https://jira.springsource.org/browse/SPR-9682

누군가가 구성 요소 검사에 의해 발견 된 빈을 재정의 할 수있는 해결 방법을 알고 있습니까?

빈은 레거시 코드이며 수정할 수 없으며 종속성에 대한 설정자가 없습니다 (개인 속성 + @Resource).

답변

4

불필요한 콩을 건너 뛸 시도 :

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

주 설정에서 건너 뛸 수 없습니다. 왜냐하면 나는 빈을 필요로하고 그 빈을 그렇지 않으면 인스턴스화 할 수있는 가능성을 보지 못하기 때문이다. "빈은 레거시 코드이고 수정 될 수 없으며 의존성에 대한 설정자 (개인 속성 + @Resource)가 없다. ". 기본 설정을 가져 오는 테스트 설정에서 가져온 기본 설정의 검색 결과가 아무렇게나 실행되기 때문에 아무런 의미가 없습니다. – mmoossen

+1

기본 구성을 두 부분으로 나눌 수 있습니다. 1) 구성 요소 검사 2) 그 밖의 모든 부분. 그런 다음 테스트 구성에서 두 번째 파일 만 가져옵니다. 따라서 테스트를 위해 구성 요소 스캔 설정을 무시할 수 있습니다. –

+0

으로 만들 수 있습니다. 아이디어를 가져 주셔서 감사합니다. 나는 그것을 시도 할 것이다. – mmoossen

0

예 구성 요소 검사에 의해 발견 콩을 대체 할 수 있습니다. 나는 이것을 테스트 케이스에서한다. 나는 XML 설정을 사용한다. 그러나 나는 자바 설정이 매우 유사하다고 생각한다.

spring.xml : 테스트 폴더에서

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

MyBeanImpl.java

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

내가 가진 :

스프링 test.xml의 :

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

MyBeanTestMock.java :

public class MyBeanTestMock implements MyBean { 
    //Something 
} 

재정의 bean 이름은 같아야합니다.

+0

문제는 구성 요소 스캔과 명시 적 xml 구성의 조합으로 설명했습니다. – mmoossen

+0

공식 버그에서 알 수 있듯이 버전 4.2에서 해결되고 해결되었습니다. – mmoossen