注:@ComponentScan是用在配置类上的,配置类用@Configuration标记
@Filter定义扫描规则
//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;
//FilterType.ASPECTJ:使用ASPECTJ表达式(几乎不用)
//FilterType.REGEX:使用正则指定(几乎不用)
//FilterType.CUSTOM:使用自定义规则
//@ComponentScan value:指定要扫描的包
//excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件
//includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
一、按注解扫描
1、不扫描哪些包:
2、扫描自定义的包:
二、按给定的类型扫描
//配置类==配置文件
@Configuration //告诉Spring这是一个配置类
@ComponentScans(
value = {
@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.ASSIGNABLE_TYPE,classes{BookService.class})
},useDefaultFilters = false)
}
)
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;
public class MainConfig {
//给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
@Bean("person")
public Person person01(){
return new Person("lisi", 20);
}
}
三、自定义TypeFilter指定过滤规则扫描
自定义TypeFilter:
public class MyTypeFilter implements TypeFilter {
/**
* metadataReader:读取到的当前正在扫描的类的信息
* metadataReaderFactory:可以获取到其他任何类信息的
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
// TODO Auto-generated method stub
//获取当前类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
System.out.println("--->"+className);
if(className.contains("er")){
return true;
}
return false;
}
}
使用自定义规则:
//配置类==配置文件
@Configuration //告诉Spring这是一个配置类
@ComponentScans(
value = {
@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false)
}
)
//FilterType.CUSTOM:使用自定义规则
public class MainConfig {
//给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
@Bean("person")
public Person person01(){
return new Person("lisi", 20);
}
}
测试:
@SuppressWarnings("resource")
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
}
结果:
注:@ComponentScans可以添加多个扫描规则,下个扫描规则在上一个规则基础之上过滤
@ComponentScans(
value = {
@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
@Filter(type=FilterType.ASSIGNABLE_TYPE,classes{BookService.class}),
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false)
}
)
======以下于你或许是个好消息======
好消息就是:欢迎访问下面的博客网站哈哈哈......
网站名称:Java学习笔记网 (点击进入)
url:https://www.javaxxbj.com/ (点击进入)
网站特点:
- java主要网站的导航目录
- 你可以记录自己的博客,并可以控制显示和隐藏,可利于管理啦!!!
- 可以添加收藏各个网站的链接!!!
- 甚至也可以文章收藏,点赞,关注,查看我的消息等功能哦!!1
看一小点点的截图:
或可一试哦!