2013-05-10 3 views
0

서비스 레지스트리 클래스를 작성하고 있습니다. 이 서비스 레지스트리는 패키지에 주석이 달린 클래스를 스캔 한 다음 내부 맵을 채 웁니다. 그때 내가 필요한 것은 어떤 메소드 (예를 들어, Object get(String name)라고 가정)를 사용하여 서비스를 문자열 이름으로 질의 할 수있게하는 것이다. 그런 다음이 메소드는 내부 맵에서 해당 이름의 서비스를 검색하고 인스턴스를 리턴합니다.스프링을 통한 임의의 클래스의 인스턴스화

내가 지금하고있는 것은이 ServiceRegistryBean을 ApplicationContextAwareBeanDefinitionRegistryPostProcessor으로 구현하고 있으며 생성시 문자열 (패키지 이름) 목록을 제공하는 것입니다.

빈이 구성되면 레지스트리 포스트 프로세서가 시작되고 레지스트리 클래스는 새로운 빈 (싱글 톤, 지연로드 됨)으로 서비스 클래스를 스프링 빈 레지스트리에 추가한다. 그런 다음, 서비스 인스턴스를 얻는 것은 컨텍스트에서 bean을 요청하고, singleton 인스턴스를 반환하는 것처럼 간단합니다.

제 질문은 : Spring에서 더 좋은 방법이 있습니까? 나는 콩 공장을 들여다 보았다. 그러나 나에게는 똑같지 않다. 서비스 인스턴스에서 자동 배선 및 DI 지원은 필수적입니다. 그 이유는 Spring에서 인스턴스화하기를 원합니다. 또한, 나는 싱글 톤을 돌보는 Spring의 아이디어를 좋아합니다.

참고 : 나는 콩을 생성 할 때 <constructor-arg>으로 인라인 할 때 (즉, bean은 이름이 지정되지 않고 다른 bean의 생성자 인수로 전달되는 인스턴스 일뿐입니다. 레지스트리를 다른 생성자에 대한 매개 변수로 사용), BeanDefinitionRegistryPostProcessor 인터페이스 메소드 (즉 public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry))가 전혀 호출되지 않습니다! 나는 확실히 알 수없는 Spring의 동작이지만 post-processor에 대한 적절한 문서를 찾을 수 없었다.

힌트 또는 통찰력을 제공해 주셔서 감사합니다. 이미 지원의 맞춤형 주석

답변

0

스캔, 당신은 단지 즉

<context:component-scan base-package="org.example"> 
    <context:include-filter type="annotation" expression="some.Annotation"/> 
</context:component-scan> 

당신이 default-lazy-init 켜면 나는 DI 컨테이너가 준비가되어 있음을 가정 http://static.springsource.org/spring/docs/current/spring-framework-reference/html/beans.html#beans-scanning-filters

을 참조 include-filter<context:component-scan>에 태그를 추가해야 Service Locator Registry로 사용합니다.

참고에 대해 BeanFactoryPostProcessors을 찾을 때 루트 빈 정의 만 고려하면 내부 빈은 무시됩니다.

일반적으로 콩을 등록 할 때 알 수 있고 STS Spring Bean Explorer와 같은 도구에서 콩을 볼 수 있지만 BeanDefinitionRegistryPostProcessor을 사용하면 콩을 검사하고 등록하는 것이 BeanDefinitionParsers입니다. 인터페이스는 다른 BeanFactoryPostProcessors이 실행되기 전에 bean이 정의되도록합니다.

+0

답변 해 주셔서 감사합니다.하지만 실제 레지스트리 클래스를 사용하고 스프링 검색 서비스를 사용하지 않는 이유가 있습니다. 그 중 하나는 라이브러리가 비 스프링 배포를 지원해야하며 주석이 그 자체로 관련되어있는 다른 메타 데이터가있다. 고려해야한다) –

+0

OK, 나는 그 메모를 잊어 버렸다. –

관련 문제