2016-12-15 35 views
1

在我們的WebApplication類中,我們使用SpringBoot,所以我們得到了默認的ComponentScan,但是我想從這次掃描中排除特定的bean。 我想排除所有豆類(用@Configuration註釋)和(不是註釋用@ConditionalOnWebApplication)。 我想:如何排除使用特定註釋進行註釋而未使用其他註釋進行註釋的bean的掃描?

@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

再次閱讀後,聽起來像我們應該在我的回答中使用'excludeFilters'而不是'includeFilters'。我看到你接受它作爲答案,但請告訴我是否屬於這種情況,我會進行編輯。 – zero01alpha

回答

3

您可以通過實現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

您的excludeFilters將不包含所有使用Configuration註釋的類,無論您的includeFilters具有什麼。你最好的方法是創建一個標記接口並添加你想要包含的類,並將其設置爲你的ComponentScan中的includeFilters。 ComponentScan將只包含這些類。

+0

這種方法在我的情況下並不好,因爲我想包含所有不屬於上述類型的bean。 它必須是數千個豆子,因爲我們的項目包括許多其他罐子。這是一個很大的項目。 – user3132197