本篇文章為大家展示了Springboot中TypeFilter的作用是什么,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)-云計(jì)算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、樂山服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級(jí)互聯(lián)網(wǎng)基礎(chǔ)服務(wù),服務(wù)熱線:18980820575
從源代碼很容易看出來,它的作用就是自動(dòng)裝配和掃描我們的包,并將符合的類進(jìn)行注冊(cè)到容器。自動(dòng)裝配非常簡單,這里不做過多分析,接下來分析一下什么叫做符合規(guī)則的類
。在@ComponentScan
注解上面的過濾器類型的定義
public enum FilterType { ANNOTATION, //注解類型 ASSIGNABLE_TYPE, //指定的類型 ASPECTJ, //按照Aspectj的表達(dá)式,基本上不會(huì)用到 REGEX, //按照正則表達(dá)式 CUSTOM; //自定義 private FilterType() { } }
這個(gè)是給我們排除符合的類,不讓他注冊(cè)到IOC
的時(shí)候使用的, Springboot默認(rèn)使用兩個(gè)排除過濾器,很簡單的,網(wǎng)上隨便搜都可以找到相關(guān)說明,在這兒我舉個(gè)特舒列子就行了.
package com.github.dqqzj.springboot.filter; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author qinzhongjian * @date created in 2019-07-30 19:14 * @description: TODO * @since JDK 1.8.0_212-b10 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Dqqzj { String value(); }
package com.github.dqqzj.springboot.filter; import org.springframework.stereotype.Component; /** * @author qinzhongjian * @date created in 2019-07-29 22:30 * @description: TODO * @since JDK 1.8.0_212-b10 */ @Dqqzj(value = "dqqzj") @Component public class Tt { }
package com.github.dqqzj.springboot.filter; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; import java.io.IOException; /** * @author qinzhongjian * @date created in 2019-07-30 19:13 * @description: TODO * @since JDK 1.8.0_212-b10 */ public class MyTypeFilter implements TypeFilter { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { if (metadataReader.getAnnotationMetadata().isAnnotated(Dqqzj.class.getName())) { return true; } return false; } }
以上代碼是正常邏輯,反過來這樣想,如果將Tt
類的@Component
注解去掉是不是也行的,所以這種排除注解一般都用在正??梢宰⑷氲饺萜鞯臅r(shí)候進(jìn)行添加的,那么我們上面說過,脫離Spring
也可以注入到容器,該怎么實(shí)現(xiàn)呢?
脫離Spring原生注解
,將將Tt
類的@Component
注解去掉
package com.github.dqqzj.springboot.filter; import org.springframework.stereotype.Component; /** * @author qinzhongjian * @date created in 2019-07-29 22:30 * @description: TODO * @since JDK 1.8.0_212-b10 */ @Dqqzj(value = "dqqzj") //@Component public class Tt { }
流程進(jìn)行梳理一下,注解驅(qū)動(dòng)在注入容器的關(guān)鍵掃描類(注意這里是指的掃描,而不是什么@Bean,@Import等其余注解都是建立在這個(gè)基礎(chǔ)之上的)
ComponentScanAnnotationParser
ClassPathBeanDefinitionScanner
ClassPathScanningCandidateComponentProvider
protected void registerDefaultFilters() { this.includeFilters.add(new AnnotationTypeFilter(Component.class)); ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader(); try { this.includeFilters.add(new AnnotationTypeFilter(ClassUtils.forName("javax.annotation.ManagedBean", cl), false)); this.logger.trace("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning"); } catch (ClassNotFoundException var4) { } try { this.includeFilters.add(new AnnotationTypeFilter(ClassUtils.forName("javax.inject.Named", cl), false)); this.logger.trace("JSR-330 'javax.inject.Named' annotation found and supported for component scanning"); } catch (ClassNotFoundException var3) { } }
上述內(nèi)容就是Springboot中TypeFilter的作用是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
名稱欄目:Springboot中TypeFilter的作用是什么
分享URL:http://www.rwnh.cn/article8/gcgeop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站維護(hù)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)