日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用@component-scan排除不需要的类

發(fā)布時間:2025/3/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用@component-scan排除不需要的类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

        • 前因
        • 方式一
        • 方式二
        • 方式三
        • 方式四
        • 方式五
        • 方式六
        • 總結(jié)

前因

我們都知道component-scan在springmvc或者springboot中可以掃描包路徑,但是我們?nèi)绾问褂美锩娴膶傩耘懦恍枰獟呙璧念?#xff1f;

方式一

使用spring的xml配置方式實現(xiàn),這個是基本功,知道這種方式,那么注解方式就容易理解了

<!-- 定義項目掃描包的路徑,并且排除ApplicationContextConfig和WebSpringMVCServletConfig--> <context:component-scan base-package="com.leo"><context:exclude-filter type="assignable" expression="com.leo.config.ApplicationContextConfig"/><context:exclude-filter type="assignable" expression="com.leo.config.WebSpringMVCServletConfig"/> </context:component-scan>

里面的type有以下幾種類型,用法不一一舉例了,大家可以自己嘗試。

過濾器類型描述
annotation過濾器掃描使用注解標注的那些類,并通過expression指定注解全類名
assignable過濾器掃描派生于expression屬性指定的類
aspectj過濾器掃描與expression屬性所指定的AspectJ表達式所匹配的那些類
custom使用自定義的org.springframework.core.type.TypeFliter實現(xiàn)類,并通過expression指定全類名
regex過濾器掃描類的名稱與expression屬性指定正則表達式所匹配的那些類

方式二

這種是通過@component-scan方式在配置掃描包路徑的時候直接不包含要排除的包。舉例說明一下如下:
項目的包路徑是:com.leo.config、con.leo.controller、con.leo.service
我不需要掃描com.leo.config,那么配置@component-scan的時候就可以使用下面的配置直接不用掃描com.leo.config

@ComponentScan(basePackages = {"con.leo.controller","con.leo.service"})

方式三

其實大部分的情況是我們只有com.leo.config下面的某個類需要排除,那么可以使用FilterType.ASSIGNABLE_TYPE排除。參考如下配置

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {ApplicationContextConfig.class, WebSpringMVCServletConfig.class}))

方式四

如果上面的class非常多的話,使用上面的方式就不太合適了,那我們可以使用FilterType.ANNOTATION加自定義注解去實現(xiàn)。參考如下配置

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = ScanIgnore.class))

自定義@ScanIgnore實現(xiàn)

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ScanIgnore { }

方式五

也可通過自定義的過濾器去實現(xiàn)。使用FilterType.CUSTOM加上自定義的過濾器

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class))

自定義過濾器MyTypeFilter

public class MyTypeFilter implements TypeFilter{/*** 過濾當前類的信息,如果包含的則不需要掃描** @param metadataReader 讀取當前正在掃描的信息* @param metadataReaderFactory 可以獲取到其他任何類的信息* @return* @throws IOException*/@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {//獲取當前類注解的信息AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//獲取當前正在掃描的類信息ClassMetadata classMetadata = metadataReader.getClassMetadata();//獲取當前類資源(類的路徑)Resource resource = metadataReader.getResource();String className = classMetadata.getClassName();//包含這個包路徑的則被攔截if(className.startsWith("com.leo.config")){System.out.println("===============>"+className);return false;}return true;} }

方式六

通過表達式來實現(xiàn)排除,使用FilterType.REGEX,配合pattern來實現(xiàn)。參考配合如下:

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.leo.config.*"))

總結(jié)

以上都是通過excludeFilters實現(xiàn)排除不需要類的方式,如果是反向操作,需要添加需要的類,則將上面的關(guān)鍵字替換為includeFilters就好了。如果是配置文件的實現(xiàn)則

<context:exclude-filter></context:exclude-filter> 替換成 <context:include-filter></context:include-filter>

spring的配置文件是基礎(chǔ),后面的無論是springmvc亦或者是springboot都是在這個基礎(chǔ)上擴展的,所以打好基礎(chǔ)很重要。

總結(jié)

以上是生活随笔為你收集整理的如何使用@component-scan排除不需要的类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。