您好,登錄后才能下訂單哦!
本篇文章為大家展示了Springboot中TypeFilter的作用是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
從源代碼很容易看出來,它的作用就是自動裝配和掃描我們的包,并將符合的類進行注冊到容器。自動裝配非常簡單,這里不做過多分析,接下來分析一下什么叫做符合規則的類
。在@ComponentScan
注解上面的過濾器類型的定義
public enum FilterType { ANNOTATION, //注解類型 ASSIGNABLE_TYPE, //指定的類型 ASPECTJ, //按照Aspectj的表達式,基本上不會用到 REGEX, //按照正則表達式 CUSTOM; //自定義 private FilterType() { } }
這個是給我們排除符合的類,不讓他注冊到IOC
的時候使用的, Springboot默認使用兩個排除過濾器,很簡單的,網上隨便搜都可以找到相關說明,在這兒我舉個特舒列子就行了.
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
注解去掉是不是也行的,所以這種排除注解一般都用在正常可以注入到容器的時候進行添加的,那么我們上面說過,脫離Spring
也可以注入到容器,該怎么實現呢?
脫離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 { }
流程進行梳理一下,注解驅動在注入容器的關鍵掃描類(注意這里是指的掃描,而不是什么@Bean,@Import等其余注解都是建立在這個基礎之上的)
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) { } }
上述內容就是Springboot中TypeFilter的作用是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。