基於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。

推薦閱讀: