[SPRING] 인터페이스의 사용자 정의 주석에 대한 구성 요소 스캔
SPRING인터페이스의 사용자 정의 주석에 대한 구성 요소 스캔
다음과 같이 구성 요소 스캔 구성이 있습니다.
@Configuration
@ComponentScan(basePackageClasses = {ITest.class},
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = JdbiRepository.class)})
public class MyConfig {
}
기본적으로 JdbiRepository 주석이있는 스캔 인터페이스를 만들고 싶습니다.
@JdbiRepository
public interface ITest {
Integer deleteUserSession(String id);
}
그리고 내 인터페이스의 프록시 구현을 만들고 싶습니다. 이 목적을 위해 필자는 기본적으로 필요한 인스턴스를 생성하는 사용자 정의 SmartInstantiationAwareBeanPostProcessor를 등록했지만 위의 구성은 JdbiRepository 주석이있는 인터페이스를 검사하지 않습니다.
맞춤 주석으로 인터페이스를 검색하려면 어떻게해야합니까?
편집하다:
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider # isCandidateComponent는 구체적인 클래스 만 받아들이고 있습니다.
/**
* Determine whether the given bean definition qualifies as candidate.
* <p>The default implementation checks whether the class is concrete
* (i.e. not abstract and not an interface). Can be overridden in subclasses.
* @param beanDefinition the bean definition to check
* @return whether the bean definition qualifies as a candidate component
*/
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
return (beanDefinition.getMetadata().isConcrete() && beanDefinition.getMetadata().isIndependent());
}
편집하다:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface JdbiRepository {
/**
* 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 "";
}
해결법
-
==============================
1.앞서 말했듯이 구성 요소 검사는 구체적인 클래스에서만 작동합니다.
앞서 말했듯이 구성 요소 검사는 구체적인 클래스에서만 작동합니다.
내 문제를 해결하기 위해 나는 다음 단계를 따라왔다.
-
==============================
2.주석이 달린 인터페이스를 스캔하는 대신 더미 구현을 생성하고 이에 따라 주석을 달 수 있습니다.
주석이 달린 인터페이스를 스캔하는 대신 더미 구현을 생성하고 이에 따라 주석을 달 수 있습니다.
@JdbiRepository public class DummyTest implements ITest { public Integer deleteUserSession(String id) { // nothing here, just being dummy } }
그런 다음 더미 구현 인 basePackageClasses = {DummyTest.class}를 검사하십시오.
그것은 약간의 해결 방법이지만, 테스트 목적을 위해 (여기에있는 것처럼) 매우 간단하고 충분히 좋습니다.
-
==============================
3.더미 구현을 만드는 것은 나에게 상당히 해커처럼 보일 것이며 Cemo가 언급 한 모든 단계는 많은 노력이 필요합니다. 그러나 ClassPathScanningCandidateComponentProvider를 확장하는 것이 가장 빠른 방법입니다.
더미 구현을 만드는 것은 나에게 상당히 해커처럼 보일 것이며 Cemo가 언급 한 모든 단계는 많은 노력이 필요합니다. 그러나 ClassPathScanningCandidateComponentProvider를 확장하는 것이 가장 빠른 방법입니다.
ClassPathScanningCandidateComponentProvider scanningProvider = new ClassPathScanningCandidateComponentProvider(false) { @Override protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { return true; } };
이제 스프링을 가진 (커스텀) Annotation으로 인터페이스를 스캔 할 수 있습니다 - Spring Boot fat jar 환경에서도 작동합니다. 빠른 클래스 패스 스캐너 (q & a에서 언급 됨)에는 몇 가지 제한이 있습니다.
from https://stackoverflow.com/questions/17477255/component-scan-for-custom-annotation-on-interface by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 자바 코드에서 작업을 예약하는 방법 (0) | 2019.05.10 |
---|---|
[SPRING] 봄 애플 리케이션 개체에 속성을 찾을 수 없습니다 (0) | 2019.05.10 |
[SPRING] org.hibernate.PersistentObjectException : 메모리 데이터베이스에 H2로 지속되도록 전달 된 분리 된 엔티티 (0) | 2019.05.10 |
[SPRING] 데이터베이스를 삭제하고 다시 만든 후 최대 절전 모드로 강제로 테이블 만들기 (0) | 2019.05.10 |
[SPRING] 봄 - 몽고 - 1.0.xsd 오류 (0) | 2019.05.10 |