SpringBoot中TypeExcludeFilter的作用及使用方式
SpringBoot中TypeExcludeFilter的作用及使用
在Spring Boot應(yīng)用程序中,TypeExcludeFilter 是一個(gè)用于過濾特定類型的組件,使之不被Spring容器自動(dòng)掃描和注冊為bean的工具。
這在你想要排除某些類或類型(如配置類、組件等)而不希望它們參與Spring的自動(dòng)裝配時(shí)非常有用。
作用
通常情況下,Spring Boot應(yīng)用會(huì)通過包掃描的方式自動(dòng)識(shí)別并加載帶有@Component, @Service, @Repository, 或者@Configuration等注解的類。
然而,在一些場景下,我們可能不希望某些特定的類被自動(dòng)加載,例如測試環(huán)境中的特殊實(shí)現(xiàn),或者是為了優(yōu)化啟動(dòng)速度而排除不必要的組件。
此時(shí),TypeExcludeFilter就派上用場了,它允許開發(fā)者根據(jù)類型來排除這些不需要的組件。
使用示例
假設(shè)我們有一個(gè)項(xiàng)目結(jié)構(gòu)如下:
com.example ├── config │ └── AppConfig.java └── service │ ├── HelloService.java │ └── WorldService.java └── MyApplication.java
這兩個(gè) Service 默認(rèn)都會(huì)被 SpringBootApplication 自動(dòng)掃描。
我們可以利用TypeExcludeFilter來確保MockService不會(huì)在非測試環(huán)境中被加載。
首先,我們需要?jiǎng)?chuàng)建一個(gè)自定義的過濾器,該過濾器繼承自TypeExcludeFilter并重寫matches方法來指定哪些類型應(yīng)該被排除。
請注意:
- 我們繼承
TypeExcludeFilter并重寫方法而不是直接實(shí)現(xiàn)TypeFilter接口中的matches方法。 - 這是因?yàn)?code>TypeExcludeFilter 是
@SpringBootApplication注解自動(dòng)掃描時(shí)候已經(jīng)默認(rèn)配置的過濾器類
如下是源碼片段:
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}編寫自定義過濾器
創(chuàng)建自定義過濾器類,繼承 TypeExcludeFilter 并重寫 match 方法:
package com.example.filter;
import org.springframework.context.annotation.TypeExcludeFilter;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
public class MyTypeExcludeFilter extends TypeExcludeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClassMetadata().getClassName();
// 根據(jù)需要設(shè)置排除邏輯,例如這里排除特定類。比如你還可以排除所有 Test開頭、Demo開頭這樣的類。
return className.startsWith("com.example.service.HelloService");
}
}注冊自定義過濾器
為了確保我們的自定義過濾器能夠在應(yīng)用啟動(dòng)時(shí)生效,我們需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)了ApplicationContextInitializer接口的類,并在此類中注冊我們的過濾器。
package com.example.initializer;
import com.example.filter.MyTypeExcludeFilter;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.core.type.filter.TypeFilter;
public class MyTypeExcludeFilterInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(@NonNull ConfigurableApplicationContext applicationContext) {
applicationContext.getBeanFactory().registerSingleton("myTypeExcludeFilter", new MyTypeExcludeFilter());
}
}配置 spring.factories
最后一步是在META-INF/spring.factories文件中注冊我們的ApplicationContextInitializer,這樣它就可以在應(yīng)用啟動(dòng)時(shí)被自動(dòng)加載:
org.springframework.context.ApplicationContextInitializer=\ com.example.initializer.MyTypeExcludeFilterInitializer
這行配置告訴Spring Boot,在應(yīng)用啟動(dòng)時(shí),應(yīng)該查找并初始化MyTypeExcludeFilterInitializer。
之所以需要在 spring.factories 中進(jìn)行配置,是因?yàn)槲覀冃枰?@ComponentScan 注解執(zhí)行之前就將我們的自定義過濾器類注冊到 spring 上下文中,否則自定義的類就沒用了。
總結(jié)
通過上述步驟,我們成功地將TypeExcludeFilter集成到了Spring Boot應(yīng)用中,并且不需要顯式地編寫@ComponentScan注解或修改任何現(xiàn)有的配置。
這種方式不僅簡化了代碼結(jié)構(gòu),也使得我們可以更加靈活地控制哪些類型的組件應(yīng)該被排除在外。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 如何解決springboot啟動(dòng)的時(shí)候required a bean of type 'XXX' not be問題
- SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
- SpringBoot3.1.2 引入Swagger報(bào)錯(cuò)Type javax.servlet.http.HttpServletRequest not present解決辦法
- SpringBoot升級(jí)3.2報(bào)錯(cuò)Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案
- 解決springboot+thymeleaf視圖映射報(bào)錯(cuò)There?was?an?unexpected?error?(type=Not?Found,?status=404)
相關(guān)文章
Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例
這篇文章主要介紹了Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例,本文直接給出代碼實(shí)例和效果截圖,需要的朋友可以參考下2014-10-10
java算法入門之有效的括號(hào)刪除有序數(shù)組中的重復(fù)項(xiàng)實(shí)現(xiàn)strStr
大家好,我是哪吒,一個(gè)熱愛編碼的Java工程師,本著"欲速則不達(dá),欲達(dá)則欲速"的學(xué)習(xí)態(tài)度,在程序猿這條不歸路上不斷成長,所謂成長,不過是用時(shí)間慢慢擦亮你的眼睛,少時(shí)看重的,年長后卻視若鴻毛,少時(shí)看輕的,年長后卻視若泰山,成長之路,亦是漸漸放下執(zhí)念,內(nèi)心歸于平靜的旅程2021-08-08
java+vue實(shí)現(xiàn)添加單選題、多選題到題庫功能
這篇文章主要為大家詳細(xì)介紹了java+vue實(shí)現(xiàn)添加單選題、多選題到題庫功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
JavaWeb實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
Spring Boot3.x自動(dòng)配置不生效的排查與解決方法(IDEA 文件夾命名導(dǎo)致的問題)
在SpringBoot多模塊項(xiàng)目中,自動(dòng)配置類未生效的問題通常源于文件路徑錯(cuò)誤,通過檢查和修正AutoConfiguration.imports文件的實(shí)際路徑,可以解決自動(dòng)配置不生效的問題,感興趣的朋友跟隨小編一起看看吧2024-11-11
Java練習(xí)之潛艇小游戲的實(shí)現(xiàn)
這篇文章主要和大家分享一個(gè)Java小練習(xí)——利用Java編寫一個(gè)潛艇小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-03-03
基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹
本篇文章小編將為大家介紹,基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹,需要的可以參考一下2013-04-04
SpringBoot和Swagger結(jié)合提高API開發(fā)效率
這篇文章主要介紹了SpringBoot和Swagger結(jié)合提高API開發(fā)效率的相關(guān)資料,需要的朋友可以參考下2017-09-09

