2016-12-15 28 views
1

WebApplicationクラスではSpringBootを使用していますので、デフォルトのComponentScanを取得していますが、このスキャンから特定のBeanを除外したいと考えています。 (@Configurationと注釈を付けた)AND(ではなく、@ConditionalOnWebApplicationと注釈を付けたすべての豆を除外したいと思います。 私が試した:特定の注釈で注釈付けされ、別の注釈で注釈付けされていない豆のスキャンを除外する方法は?

@SpringBootApplication 
@ComponentScan(basePackages = { "com.yevgeny"} , includeFilters = {@ComponentScan.Filter(value = ConditionalOnWebApplication.class)} , excludeFilters = {@ComponentScan.Filter(value = Configuration.class)}) 
public class WebApplication extends SpringBootServletInitializer implements WebApplicationInitializer {...} 

しかし、それは両方のアノテーションを持つクラスをスキャンしませんでした。 どのようにして必要な結果を達成できますか?

+0

これをもう一度読んだら、私は 'includeFilters'ではなく私の答えで' excludeFilters'を使うべきであるように思えます。私はあなたが答えとしてそれを受け入れたことを知っていますが、これが当てはまる場合は教えてください。私は編集を行います。 – zero01alpha

答えて

3

私は実際にこののいずれかをテストしていないが、それはステップのように思えます正しい方向に。

0

excludeFiltersは、includeFiltersの内容にかかわらず、Configurationで注釈が付けられたすべてのクラスを除外します。あなたの最善の方法は、マーカーインターフェイスを作成してそれに含まれるクラスを追加し、これをComponentScanのincludeFiltersに設定することです。 ComponentScanには、これらのクラスのみが含まれます。あなたはorg.springframework.core.type.filter.TypeFilter

public class CustomFilter implements TypeFilter { 

    @Override 
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) 
     throws IOException { 
     Set<String> annotations = metadataReader.getAnnotationMetadata().getAnnotationTypes(); 

     return annotations.contains(Configuration.class.getName()) 
      && !annotations.contains(ConditionalOnWebApplication.class.getName()); 
    } 

} 

を実装することにより、カスタムフィルタを作成し、この

@SpringBootApplication 
@ComponentScan(includeFilters = @Filter(type=FilterType.CUSTOM, value=CustomFilter.class)) 
public class WebApplication extends SpringBootServletInitializer implements WebApplicationInitializer {...} 

ようなもので終わることができ

+0

上記のタイプ以外のすべてのBeanをインクルードしたいので、この方法は私の場合は良くありません。 プロジェクトには数千の豆が必要です。プロジェクトには他の多くの瓶が含まれているからです。それは大きなプロジェクトです。 – user3132197

関連する問題