我是 ABin-阿斌:写一生代码,创一世佳话。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
前言
- 如今我们这个行业领域的各大中小型公司大部分都使用了 SpringBoot、SpringCloud 的技术架构来开发项目,这些基础也是当前最火热的技术,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解、原理,比如@Conditional、@Import、@EnableXXX等。如果掌握这些底层原理、注解,那么我们对这些高层框架就能做到高度定制,在实际开发当中我们会使用的游刃有余。
@Configuration
说明: 改注解加到任何一个类上,那么这个类就表明是一个配置类。这个配置类就好比我们以前的 xml 文件。
@Bean
说明: 该注解表示给容器中注入一个 Bean,类型为返回值的类型,id 默认用方法名作为 id
未使用注解之前配置:
使用注解之后:
运行结果:
@ComponentScan
说明: 指定要扫描的包路径,value:指定扫描的包路径
其它参数介绍:
- excludeFilters = Filter[] :指定扫描的时候过滤掉哪些注解
- includeFilters = Filter[] :指定扫描的时候只扫描哪些注解
-
1.FilterType.ANNOTATION:按照注解
-
2.FilterType.ASSIGNABLE_TYPE:按照给定的类型;
-
3.FilterType.ASPECTJ:使用ASPECTJ表达式
-
4.FilterType.REGEX:使用正则指定
-
5.FilterType.CUSTOM:使用自定义规则
-
useDefaultFilters:用来指示是否自动扫描带有 @Component、@Repository、@Service和 @Controller的类。默认为 true,即默认扫描。
未使用注解:
使用注解:
创建一个自定义过滤规则类:
package com.mangobin.config;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
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 ABin-阿斌
*
* 自定义类型过滤器:
* match 方法:
* 参数一:MetadataReader:表示读取当前正在扫描的类信息
* 参数二:MetadataReaderFactory:表示获取所有扫描到的类信息
*/
public class MyTypeFilter implements TypeFilter {
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
System.out.println("======================="+className);
//判断扫描类是否包含 er 如何包含则进行输出
if(className.contains("er")){
return true;
}
//获取当前类的资源引用信息(类的路径)
Resource resource = metadataReader.getResource();
return false;
}
}
运行结果
输出结果请结合上方代码来和注解理论说明来观看
补充: 其它三个类的输出应为我们上方代码写了一个判断:看这是否有包含 er 字母的类,如果有那么就返回 true,所以这三个类都有 er。