2014-11-13 2 views
0

어노테이션 기반 구성 요소 검색을 수행하는 동안 한정자를 적용하는 방법이 있습니까?스프링 어노테이션 및 한정어 기반 검색

나는 내 맞춤 주석으로 주석 처리 된 두 개의 클래스가 있습니다 (MyAnnotation). 무엇 내가하고 싶은

@MyAnnotation 
public class ClassOne { 
} 

@MyAnnotation 
public class ClassTwo { 
} 

@Configuration 
@ComponentScan(basePackages = { "common" }, useDefaultFilters = false, includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = MyAnnotation.class) }) 
public class ClassProvider { 
} 

는, 사용자로부터 어떤 입력을 말하는 선택적으로 일부 조건에 따라이 주석으로 클래스의 부분 집합을 스캔 할 수 있습니다. 단지 ClassOne 스캔됩니다 그래서

@MyAnnotation (qualifier = "one") 
public class ClassOne { 
} 

@MyAnnotation (qualifier = "two") 
public class ClassTwo { 
} 

@Configuration 
@ComponentScan(basePackages = { "common" }, useDefaultFilters = false, includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = MyAnnotation.class, qualifier = "one") }) 
public class ClassProvider { 
} 

-

는이 같은 뭔가를 주석과 함께 규정을 지정하고 또한 구성 요소 검색 필터를 지정 말할 수 있습니까?

답변

0

당신의 @ComponentScan 모양을 할 수 있도록 사용자 정의 TypeFilter을 구현할 수 있습니다

@ComponentScan(includeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, value = MyAnnotation.class) }) 

그리고 매개 변수 typeFilter 구현 : 당신의 대답을, 나는 그것을 시도 줄 것이다

public class TypeOneFilter implements TypeFilter { 

    @Override 
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { 
     final AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); 

     if (annotationMetadata.hasAnnotation(MyAnnotation.class.getName())) { 
      final Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(MyAnnotation.class.getName()); 

      return "one".equals(attributes.get("qualifier")); 
     } 

     return false; 
    } 

} 
+0

감사합니다; 나는 그것이 내가 찾고 있었던 것이라고 생각한다. 주석에 대한 한정자 값을 동적으로 설정하고 싶습니다.하지만 스프링 특유의 질문보다 표준 자바 주석 질문에 더 가깝습니다. – Kesh

+0

멋지지만, [Spring profile] (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-definition-profiles)을 사용하고 싶지 않은가? -java)를 지원합니까? –

+0

프로필을 실제로 사용하지는 않았지만 그 옵션은 훨씬 좋아졌습니다. 내가 사용했다면 커스텀'TypeFilter'를 구현할 필요가 없을 것입니다. 구성이나 구성 요소와 같은 다른 주석을 수반 할 필요가 없다는 점에서 나는 맞습니까? 지정된 프로필이 활성화되어 있지 않으면 구성 요소 스캐너가 클래스를 검색하지 않습니다. – Kesh

관련 문제