文章目录
- 1.excludeFilters:排除过滤器
- 2.includeFilters:包含过滤器
- 3.问题:spring为什么能通过是否有@Component注解来判断是否需要去注册bean呢?
- 3.1 看源码
- 3.2 原因
- 4.总结
1.excludeFilters:排除过滤器
用excludeFilters排除UserService 这个类后,UserService 虽然加了@Component注解但依然不能生成bean
@ComponentScan(value = "com.zjy",excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = UserService.class
)
})
public class AppConfig {}
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean(
"userService");
}
运行结果:
2.includeFilters:包含过滤器
UserService 类上没有加任何注解,spring在扫描时发现这个类没有@Component等注解就不会把这个类注册为bean
public class UserService{}
但是现在在AppConfig中用includeFilters把UserService包含进去 ,即使UserService 类上没有@Component,spring也会把它注册为bean
@ComponentScan(value = "com.zjy",includeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = UserService.class
)
})
public class AppConfig{}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean(
"userService");
System.out.println(userService);
运行结果:
3.问题:spring为什么能通过是否有@Component注解来判断是否需要去注册bean呢?
过滤器FilterType分为:
- ANNOTATION:表示是否包含某个注解
- ASSIGNABLE_TYPE:表示是否是某个类
- ASPECTJ:表示否是符合某个Aspectj表达式
- REGEX:表示是否符合某个正则表达式
- CUSTOM:自定义
3.1 看源码
3.2 原因
在扫描器中会把Component注解添加到 包含过滤器中
4.总结
好记性不如烂笔头,知道不如做到。