복붙노트

[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. ==============================

    1.앞서 말했듯이 구성 요소 검사는 구체적인 클래스에서만 작동합니다.

    앞서 말했듯이 구성 요소 검사는 구체적인 클래스에서만 작동합니다.

    내 문제를 해결하기 위해 나는 다음 단계를 따라왔다.

  2. ==============================

    2.주석이 달린 인터페이스를 스캔하는 대신 더미 구현을 생성하고 이에 따라 주석을 달 수 있습니다.

    주석이 달린 인터페이스를 스캔하는 대신 더미 구현을 생성하고 이에 따라 주석을 달 수 있습니다.

    @JdbiRepository
    public class DummyTest implements ITest {
      public Integer deleteUserSession(String id) {
        // nothing here, just being dummy
      }
    }
    

    그런 다음 더미 구현 인 basePackageClasses = {DummyTest.class}를 검사하십시오.

    그것은 약간의 해결 방법이지만, 테스트 목적을 위해 (여기에있는 것처럼) 매우 간단하고 충분히 좋습니다.

  3. ==============================

    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에서 언급 됨)에는 몇 가지 제한이 있습니다.

  4. from https://stackoverflow.com/questions/17477255/component-scan-for-custom-annotation-on-interface by cc-by-sa and MIT license