2012-06-19 4 views
2

@Configuration (주석을 달아 보자. StubConfiguration이라고 부름) 클래스에는 @Bean이라는 주석이 붙은 단일 메소드가있다. 이 메소드는 일부 빈을 등록하는 BeanFactoryPostProcessor 구현을 리턴합니다. 그러나 Spring은이 팩토리를 런타임에 등록하는 빈을 해석 할 수 없다.Configuration-annotated 클래스에서 bean 등록하기

내 가정은 이 등록 된 다음 postProcessBeanFactory() 메서드가 호출되어 필요한 bean을 등록한 것으로 가정합니다.

내가 잘못 생각하나요? 이 후 처리를 사용하여 ApplicationContext과 함께 필요한 빈을 등록하는 방법은 무엇입니까?

+0

나는 콩 종속성은 아마도'BeanFactoryPostProcessor'가 호출되기 전에 결정된다 생각합니다. 왜 새 bean을'@ Configuration' 클래스에서 직접 생성하지 않고 후 처리기에 등록해야합니까? – matts

+0

@matts : 포스트 프로세서는'@ Stub' 주석으로 클래스를 검색하고 클래스를 등록합니다. 나는 그렇지 않으면 쉽게 할 수있는 방법을 생각할 수 없다. –

+0

이 스텁과 관련해서는 특별한 일을 할 것인가 아니면 Spring에게 애플리케이션 컨텍스트에 추가하고 정상적으로 처리하도록 알려줄 것인가? – matts

답변

0

XML 애플리케이션 컨텍스트를 사용하여 bean을 선언하는 경우 Spring에 구성 요소 스캔을 수행하고 @Stub을 Spring 컴포넌트 주석으로 처리 할 수 ​​있습니다.

<context:component-scan base-package="your.base.package"> 
    <context:include-filter type="annotation" expression="your.stub.package.Stub"/> 
</context:component-scan> 

만 주석 설정 응용 프로그램 컨텍스트를 사용하는 경우, XML없이 그것을 할 수있는 방법을 this answer을 확인하십시오.

+0

완전히 따라갈 지 모르겠습니다. bean의 이름을 포함하는'Stub' 어노테이션으로 주석이 달린 스텁 클래스가 있습니다. @Stub ("myStub")'. 그런 다음 나중에, 예를 들어,'context.getBean ("myStub", MyStub.class)'와 같은 것을 할 수 있습니다. –

+0

프로젝트에 제어 할 수있는'applicationContext.xml' 파일 (또는 다른 XML 스프링 컨텍스트 파일)이 있습니까? 위에서'component-scan' 태그가 들어가서 Spring에게 지정된 패키지를 검색하고 지정된 주석을 가진 클래스를 찾도록 지시합니다. 이러한 클래스는 응용 프로그램 컨텍스트에 bean으로 추가됩니다. (그러나 클래스의 이름을 사용하는 기본 명명 전략을 사용하여 이름을 지정합니다.) Spring 응용 프로그램 컨텍스트 파일이 없으면 다른 방법으로 수행해야합니다. – matts

+0

팩토리가 들어있는 패키지를'component-scan'의'base-package '에 추가하기 만하면됩니다. 그것은 별도의 패키지에 있었기 때문에 Spring에 의해 선택되지 않았습니다. 이를 추가하면 사후 처리 중 bean이 등록됩니다. –

0

@Stub 주석을 작성하는 경우 @Component 주석을 확장 하시겠습니까? @Service 또는 @Repository과 같습니다.

일반적인 봄 컨텍스트 검색으로 빈을 스캔하게되면 사용자 정의 주석을 유지할 수 있으며 수동으로 콩을 등록 할 필요가 없습니다. @Service에서

예 :

{@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Component 
public @interface Service { 

    /** 
    * The value may indicate a suggestion for a logical component name, 
    * to be turned into a Spring bean in case of an autodetected component. 
    * @return the suggested component name, if any 
    */ 
    String value() default ""; 

}} 
+0

불행히도'Stub'을 수정하는 것은 관리 할 수 ​​없기 때문에 가능하지 않습니다. 그렇다고해도 이름으로 콩을로드하는 방법은 무엇입니까? 예를 들어, 다른 응답에 대한 주석에서 언급 한 것처럼 @Stub ("myStub")로 스텁 빈에 주석을 추가 한 경우. 내 포스트 프로세서 팩토리는 현재이 이름 값을 사용하여'Stub' 빈을 등록하기 때문에 나중에이 값을 사용하여 검색 할 수 있습니다. –