基于spring boot排除掃描類(lèi)的三種方式小結(jié)
最近在做單測(cè)的時(shí)候,由于自己配置的spring boot容器會(huì)默認(rèn)掃描很多不想被加載,網(wǎng)上中文的文章并不多,所以來(lái)總結(jié)一下。
默認(rèn)下面描述的類(lèi)都在一個(gè)包下面
第一步我們新建一個(gè)應(yīng)用啟動(dòng)的類(lèi),一個(gè)類(lèi)用來(lái)充當(dāng)Configuration,為了能明顯的感知到其到底有沒(méi)生效,我編寫(xiě)如下:
@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;
}
};
}
}
我們可以啟動(dòng)應(yīng)用發(fā)現(xiàn)輸出
初始化了 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
說(shuō)明被@Configuration 修飾的類(lèi)MyConfig本身被掃描了。
方法1:用exclude指明明確要排除的類(lèi).
@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屬性,可以明確排除調(diào)需要掃描的類(lèi)。
但是這里存在一個(gè)問(wèn)題,如果要排除的類(lèi)比較多,那這里會(huì)看起來(lái)很冗余。我們可以采用第二種方式。注解排除。
方法2 : 用注解方式排除
public @interface IgnoreScan {
}
新建此注解。
在需要忽略的類(lèi)上添加:
@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 :
第三種方式實(shí)現(xiàn)org.springframework.core.type.filter.TypeFilter,然后也是ComponentScan去排除指定的注解。網(wǎng)上寫(xiě)的好的文章很多,這里不多說(shuō)了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Bigdecimal科學(xué)計(jì)數(shù)問(wèn)題
這篇文章主要介紹了基于Bigdecimal科學(xué)計(jì)數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
MybatisPlus?構(gòu)造器wrapper的使用與原理解析
本次我們介紹了MybatisPlus?構(gòu)造器wrapper的使用方式及其易錯(cuò)點(diǎn),同時(shí)也針對(duì)其運(yùn)行的原理進(jìn)行了解釋,只有深刻理解了它的原理,我們才能更靈活的使用,并且更快的排查出問(wèn)題,感興趣的朋友跟隨小編一起看看吧2024-05-05
非常適合新手學(xué)生的Java線程池優(yōu)化升級(jí)版
作者是一個(gè)來(lái)自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請(qǐng)指正,將來(lái)會(huì)不斷的完善筆記,幫助更多的Java愛(ài)好者入門(mén)2022-03-03
關(guān)于Spring Cloud 本地屬性覆蓋的問(wèn)題
這篇文章主要介紹了關(guān)于Spring Cloud 本地屬性覆蓋的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java實(shí)現(xiàn)讀取SFTP服務(wù)器指定目錄文件的方法
SFTP是一種在安全通道上傳輸文件的協(xié)議,它是基于SSH(Secure Shell)協(xié)議的擴(kuò)展,用于在客戶(hù)端和服務(wù)器之間進(jìn)行加密的文件傳輸,這篇文章主要介紹了Java實(shí)現(xiàn)讀取SFTP服務(wù)器指定目錄文件,感興趣的朋友跟隨小編一起看看吧2023-08-08
Java Swing中的文本框(JTextField)與文本區(qū)(JTextArea)使用實(shí)例
這篇文章主要介紹了Java Swing中的文本框(JTextField)與文本區(qū)(JTextArea)使用實(shí)例,Swing是一個(gè)用于開(kāi)發(fā)Java應(yīng)用程序用戶(hù)界面的開(kāi)發(fā)工具包,需要的朋友可以參考下2014-10-10
如何在Spring Boot項(xiàng)目中使用Spring AI
Spring AI是Spring框架中用于集成和使用人工智能和機(jī)器學(xué)習(xí)功能的組件,它提供了一種簡(jiǎn)化的方式來(lái)與AI模型進(jìn)行交互,這篇文章主要介紹了Spring Boot 在項(xiàng)目中使用Spring AI,需要的朋友可以參考下2024-05-05
Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐
本文主要介紹了Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Spring中基于xml的AOP實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring中基于xml的AOP實(shí)現(xiàn)詳解,基于xml與基于注解的AOP本質(zhì)上是非常相似的,都是需要封裝橫切關(guān)注點(diǎn),封裝到切面中,然后把橫切關(guān)注點(diǎn)封裝為一個(gè)方法,再把該方法設(shè)置為當(dāng)前的一個(gè)通知,再通過(guò)切入點(diǎn)表達(dá)式定位到橫切點(diǎn)就可以了,需要的朋友可以參考下2023-09-09

