서비스 레지스트리 클래스를 작성하고 있습니다. 이 서비스 레지스트리는 패키지에 주석이 달린 클래스를 스캔 한 다음 내부 맵을 채 웁니다. 그때 내가 필요한 것은 어떤 메소드 (예를 들어, Object get(String name)
라고 가정)를 사용하여 서비스를 문자열 이름으로 질의 할 수있게하는 것이다. 그런 다음이 메소드는 내부 맵에서 해당 이름의 서비스를 검색하고 인스턴스를 리턴합니다.스프링을 통한 임의의 클래스의 인스턴스화
내가 지금하고있는 것은이 ServiceRegistryBean을 ApplicationContextAware
과 BeanDefinitionRegistryPostProcessor
으로 구현하고 있으며 생성시 문자열 (패키지 이름) 목록을 제공하는 것입니다.
빈이 구성되면 레지스트리 포스트 프로세서가 시작되고 레지스트리 클래스는 새로운 빈 (싱글 톤, 지연로드 됨)으로 서비스 클래스를 스프링 빈 레지스트리에 추가한다. 그런 다음, 서비스 인스턴스를 얻는 것은 컨텍스트에서 bean을 요청하고, singleton 인스턴스를 반환하는 것처럼 간단합니다.
제 질문은 : Spring에서 더 좋은 방법이 있습니까? 나는 콩 공장을 들여다 보았다. 그러나 나에게는 똑같지 않다. 서비스 인스턴스에서 자동 배선 및 DI 지원은 필수적입니다. 그 이유는 Spring에서 인스턴스화하기를 원합니다. 또한, 나는 싱글 톤을 돌보는 Spring의 아이디어를 좋아합니다.
참고 : 나는 콩을 생성 할 때 <constructor-arg>
으로 인라인 할 때 (즉, bean은 이름이 지정되지 않고 다른 bean의 생성자 인수로 전달되는 인스턴스 일뿐입니다. 레지스트리를 다른 생성자에 대한 매개 변수로 사용), BeanDefinitionRegistryPostProcessor
인터페이스 메소드 (즉 public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
)가 전혀 호출되지 않습니다! 나는 확실히 알 수없는 Spring의 동작이지만 post-processor에 대한 적절한 문서를 찾을 수 없었다.
힌트 또는 통찰력을 제공해 주셔서 감사합니다. 이미 지원의 맞춤형 주석
답변 해 주셔서 감사합니다.하지만 실제 레지스트리 클래스를 사용하고 스프링 검색 서비스를 사용하지 않는 이유가 있습니다. 그 중 하나는 라이브러리가 비 스프링 배포를 지원해야하며 주석이 그 자체로 관련되어있는 다른 메타 데이터가있다. 고려해야한다) –
OK, 나는 그 메모를 잊어 버렸다. –