7

次のようなコンポーネント スキャン構成があります。

   @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 "";
}
4

3 に答える 3

4

ダミーの実装を作成することは、私には非常にハックに思えます。Cemoが言及したすべての手順には、多くの労力が必要です。ただし、ClassPathScanningCandidateComponentProviderを拡張するのが最速の方法です。

ClassPathScanningCandidateComponentProvider scanningProvider = new ClassPathScanningCandidateComponentProvider(false) {
    @Override
    protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
        return true;
    }
};

これで、Spring を使用して (カスタム) アノテーションを使用してインターフェイスをスキャンすることもできます。これは、Spring Boot の fat jar 環境でも機能します。この場合、fast-classpath-scanner (これはq&aで言及されています) にはいくつかの制限があります。

于 2017-01-06T11:07:58.197 に答える
3

先に述べたように、コンポーネント スキャンは具体的なクラスに対してのみ機能します。

私の問題を解決するために、次の手順に従いました。

  1. カスタムを実装しましたorg.springframework.context.annotation.ImportBeanDefinitionRegistrar
  2. EnableJdbiRepositoriesカスタム インポーターをインポートするカスタム アノテーションを作成しました。
  3. インターフェイスもスキャンするために ClassPathScanningCandidateComponentProvider を拡張しました。カスタム インポーターもこのクラスを使用してインターフェイスをスキャンしました。
于 2013-07-08T08:08:21.380 に答える
0

注釈付きインターフェースをスキャンする代わりに、ダミーの実装を作成し、それに応じて注釈を付けることができます。

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

次に、ダミーの実装をスキャンしますbasePackageClasses = {DummyTest.class}

これはちょっとした回避策ですが、非常にシンプルで、テスト目的には十分です (ここにあるようです)。

于 2013-07-04T23:56:35.480 に答える