(四)组件注册--@ComponentScan--Filter属性
程序员文章站
2022-05-18 17:41:45
1,前言有关@ComponentScan的Filter属性的记录2,Filter@ComponentScan中还有一些属性://扫描的时候只扫描哪些指定的组件 ComponentScan.Filter[] includeFilters() default {};//扫描的时候按照哪些规则排除指定的组件 ComponentScan.Filter[] excludeFilters() default {};2.1,excludeFiltersMainConfig主配置类/*...
1,前言
有关@ComponentScan的Filter属性的记录
2,Filter
@ComponentScan中还有一些属性:
//扫描的时候只扫描哪些指定的组件
ComponentScan.Filter[] includeFilters() default {};
//扫描的时候按照哪些规则排除指定的组件
ComponentScan.Filter[] excludeFilters() default {};
2.1,excludeFilters
MainConfig主配置类
/**
* 配置类==配置文件
*/
//告诉spring这是一个配置文件
@Configuration
//包扫描,value值指的是要扫描的包
@ComponentScan(value="com.cb414",excludeFilters = {
//type= FilterType.ANNOTATION意思是按照注解来进行排除
//也可以按照类,方法等来进行排除,只需改变type的值即可
//classes = {Controller.class, Service.class}意思是要排除的注解的类型
//在这里指的是排除扫描@Controller和@Service注解标注的类
@ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class, Service.class})
})
//FilterType.ANNOTATION表示按照注解的方式进行过滤
//FilterType.ASSIGNABLE_TYPE表示按照指定的类型进行过滤
//FilterType.ASPECTJ使用ASPECTJ表达式进行过滤,但是一般不常用
//FilterType.REGEX使用正则表达式进行过滤(不常用)
//FilterType.CUSTOM表示使用自定义规则,这个自定义规则得要是TypeFilter的实现类
public class MainConfig {
//给容器中注册一个bean,类型为返回值的类型,id为方法名
@Bean
public Person person(){
return new Person("lisi",20);
}
}
测试类
public class IOCTest {
@Test
public void test01(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
//看到容器中所有定义的bean的名字
String[] names = annotationConfigApplicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
运行结果
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
bookDao
person
2.2,includeFilters
在使用 includeFilters()时,必须要先禁用掉@ComponentScan的使用默认过滤器的设置
@ComponentScan注解:
public @interface ComponentScan {
...
boolean useDefaultFilters() default true;
...
}
所以:主配置类:
/**
* 配置类==配置文件
*/
//告诉spring这是一个配置文件
@Configuration
//包扫描,value值指的是要扫描的包
@ComponentScan(value="com.cb414",includeFilters = {
@ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class, Service.class})
},useDefaultFilters = false)
//FilterType.ANNOTATION表示按照注解的方式进行过滤
//FilterType.ASSIGNABLE_TYPE表示按照指定的类型进行过滤
//FilterType.ASPECTJ使用ASPECTJ表达式进行过滤,但是一般不常用
//FilterType.REGEX使用正则表达式进行过滤(不常用)
//FilterType.CUSTOM表示使用自定义规则,这个自定义规则得要是TypeFilter的实现类
public class MainConfig {
//给容器中注册一个bean,类型为返回值的类型,id为方法名
@Bean
public Person person(){
return new Person("lisi",20);
}
}
运行结果:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
bookController
bookService
person
2.3,自定义TypeFilter
指定过滤规则
自定义的过滤规则类
public class MyTypeFilter implements TypeFilter {
/**
*
* @param metadataReader:读取到的正在扫描的类的信息
* @param metadataReaderFactory:可以获取到的其他任何类的信息
*/
@Override
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);
//获取当前类的资源信息(类的路径呀...)
Resource resource = metadataReader.getResource();
//如果扫描到的类名中包括er,就返回true,从而进行导入
if(className.contains("er")){
return true;
}
//返回值写的是false,也就是说一个都不匹配
return false;
}
}
主配置类
/**
* 配置类==配置文件
*/
//告诉spring这是一个配置文件
@Configuration
//包扫描,value值指的是要扫描的包
@ComponentScan(value="com.cb414",includeFilters = {
//自定义规则需要传入的是自定义规则类的类型,在这里就是MyTypeFilter的类型
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
},useDefaultFilters = false)
//FilterType.ANNOTATION表示按照注解的方式进行过滤
//FilterType.ASSIGNABLE_TYPE表示按照指定的类型进行过滤
//FilterType.ASPECTJ使用ASPECTJ表达式进行过滤,但是一般不常用
//FilterType.REGEX使用正则表达式进行过滤(不常用)
//FilterType.CUSTOM表示使用自定义规则,这个自定义规则得要是TypeFilter的实现类
public class MainConfig {
//给容器中注册一个bean,类型为返回值的类型,id为方法名
@Bean
public Person person(){
return new Person("lisi",20);
}
}
测试类:
public class IOCTest {
@Test
public void test01(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
//看到容器中所有定义的bean的名字
String[] names = annotationConfigApplicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
运行结果:
类名-->com.cb414.IOCTest
类名-->com.cb414.bean.Person
类名-->com.cb414.config.MyTypeFilter
类名-->com.cb414.controller.BookController
类名-->com.cb414.dao.BookDao
类名-->com.cb414.MainTest
类名-->com.cb414.service.BookService
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
person
myTypeFilter
bookController
bookService
至于这里为什么有MyTypeFilter,是因为我们在主配置类中的@ComponentScan中写的是:使用自定义规则,扫描com.cb414包下面的所有类,将类名中含有er的类进行导入!
本文地址:https://blog.csdn.net/weixin_41043607/article/details/107591075
推荐阅读