Springboot中TypeFilter的作用是什么
本篇文章为大家展示了Springboot中TypeFilter的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联-云计算及IDC服务提供商,涵盖公有云、IDC机房租用、乐山服务器托管、等保安全、私有云建设等企业级互联网基础服务,服务热线:18980820575
SpringBootApplication注解分析
从源代码很容易看出来,它的作用就是自动装配和扫描我们的包,并将符合的类进行注册到容器。自动装配非常简单,这里不做过多分析,接下来分析一下什么叫做符合规则的类
。在@ComponentScan
注解上面的过滤器类型的定义
public enum FilterType { ANNOTATION, //注解类型 ASSIGNABLE_TYPE, //指定的类型 ASPECTJ, //按照Aspectj的表达式,基本上不会用到 REGEX, //按照正则表达式 CUSTOM; //自定义 private FilterType() { } }
excludeFilters排除过滤器
这个是给我们排除符合的类,不让他注册到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
也可以注入到容器,该怎么实现呢?
includeFilters包含过滤器
脱离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
ClassPathScanningCandidateComponentProvider#registerDefaultFilters
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的作用是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。
网站栏目:Springboot中TypeFilter的作用是什么
链接URL:http://myzitong.com/article/gcgeop.html