基於spring boot排除掃描類的三種方式小結
最近在做單測的時候,由於自己配置的spring boot容器會默認掃描很多不想被加載,網上中文的文章並不多,所以來總結一下。
默認下面描述的類都在一個包下面
第一步我們新建一個應用啟動的類,一個類用來充當Configuration,為瞭能明顯的感知到其到底有沒生效,我編寫如下:
@SpringBootApplication public class Test { public static void main(String[] args) { new SpringApplication(Test.class).run(args); } }
@Configuration public class MyConfig { @Bean public BeanPostProcessor beanPostProcessor() { System.out.println("初始化瞭 bean BeanPostProcessor"); return new BeanPostProcessor() { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("加載瞭bean " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }; } }
我們可以啟動應用發現輸出
初始化瞭 bean BeanPostProcessor 加載瞭bean org.springframework.context.event.internalEventListenerProcessor 加載瞭bean org.springframework.context.event.internalEventListenerFactory 加載瞭bean org.springframework.boot.autoconfigure.AutoConfigurationPackages 加載瞭bean org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration 加載瞭bean org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration 加載瞭bean objectNamingStrategy 加載瞭bean mbeanServer 加載瞭bean mbeanExporter 加載瞭bean org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration 加載瞭bean spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties 加載瞭bean org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration 加載瞭bean org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration
說明被@Configuration 修飾的類MyConfig本身被掃描瞭。
方法1:用exclude指明明確要排除的類.
@SpringBootApplication @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {MyConfig.class})}) public class Test { public static void main(String[] args) { new SpringApplication(Test.class).run(args); } }
用ComponentScan的excludeFilters屬性,可以明確排除調需要掃描的類。
但是這裡存在一個問題,如果要排除的類比較多,那這裡會看起來很冗餘。我們可以采用第二種方式。註解排除。
方法2 : 用註解方式排除
public @interface IgnoreScan { }
新建此註解。
在需要忽略的類上添加:
@Configuration @IgnoreScan public class MyConfig { @Bean public BeanPostProcessor beanPostProcessor() { System.out.println("初始化瞭 bean BeanPostProcessor"); return new BeanPostProcessor() { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("加載瞭bean " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }; } }
這樣即可排除掉不被掃描瞭。
方法3 :
第三種方式實現org.springframework.core.type.filter.TypeFilter,然後也是ComponentScan去排除指定的註解。網上寫的好的文章很多,這裡不多說瞭。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring源碼解析之BeanPostProcessor知識總結
- Java Spring Bean的生命周期管理詳解
- Spring BeanPostProcessor(後置處理器)的用法
- 詳解Spring中Bean後置處理器(BeanPostProcessor)的使用
- Spring BeanPostProcessor源碼示例解析