Spring包扫描
来源:互联网 发布:程序员修炼之道百度云 编辑:程序博客网 时间:2024/06/06 14:07
测试了下spring 包扫描 :
<context:component-scan base-package="com.long.apple.scantest" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
其中use-default-filters参数默认为true
也就说可以扫描@controller和@service/@Repository注解的bean;
如果设置use-default-filters参数默认为false就不再加载任何bean;
对以上情况也有列外,就是用
通过exclude-filter 进行黑名单过滤;
通过include-filter 进行白名单过滤;
也就说:如果参数use-default-filters设置为false只加载include-filter类型的bean,其它bean不再加载;
如果参数use-default-filters设置为true,则全部加载@controller和@service\@respository 类型的bean,排除exclude-filter类型的bean;
这样看来如果默认use-default-filters为true,再加include-filter控制,如果控制范围是@controller和@service\@respository 类型就没意义,当然可以加include-filter控制其它注解也实例化,比如自己实现的一个注解@zhujie
<context:component-scan base-package="com.elong.apple.scantest" use-default-filters="true">
<context:exclude-filter type="annotation" expression="com.long.apple.scantest.Zhujie"/>
</context:component-scan>
可以写两个注解测试下:
具体实现代码可以参考org.springframework.context.annotation.ClassPathBeanDefinitionScanner中的代码处理:
其中两个方法:
1.如果没有配置<context:component-scan>的use-default-filters属性,则默认为true,在创建ClassPathBeanDefinitionScanner时会根据use-default-filters是否为true来调用如下代码:
- protected void registerDefaultFilters() {
- this.includeFilters.add(new AnnotationTypeFilter(Component.class));
- ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
- try {
- this.includeFilters.add(new AnnotationTypeFilter(
- ((Class<? extends Annotation>) cl.loadClass("javax.annotation.ManagedBean")), false));
- logger.info("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning");
- }
- catch (ClassNotFoundException ex) {
- // JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.
- }
- try {
- this.includeFilters.add(new AnnotationTypeFilter(
- ((Class<? extends Annotation>) cl.loadClass("javax.inject.Named")), false));
- logger.info("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");
- }
- catch (ClassNotFoundException ex) {
- // JSR-330 API not available - simply skip.
- }
2.通过include-filter/exclude-filter来判断你的Bean类是否是合法的:
- protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {
- for (TypeFilter tf : this.excludeFilters) {
- if (tf.match(metadataReader, this.metadataReaderFactory)) {
- return false;
- }
- }
- for (TypeFilter tf : this.includeFilters) {
- if (tf.match(metadataReader, this.metadataReaderFactory)) {
- AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
- if (!metadata.isAnnotated(Profile.class.getName())) {
- return true;
- }
- AnnotationAttributes profile = MetadataUtils.attributesFor(metadata, Profile.class);
- return this.environment.acceptsProfiles(profile.getStringArray("value"));
- }
- }
- return false;
- }
- Spring包扫描
- Spring 包自动扫描
- spring 扫描包 不起作用
- Spring 包扫描
- spring component-scan 包扫描
- spring扫描包管理bean
- spring 和 spring mvc 扫描包问题
- Spring 学习记录 4 扫描包
- Spring 使用@ComponentScan扫描注解包
- spring组件扫描包component-scan
- spring和springMVC扫描包的问题
- Spring和SpringMVC的包扫描问题
- spring包扫描<context:component-scan>说明
- Spring扫描自定义jar包中的Bean
- Spring和Spring MVC包分开扫描原因
- 为啥Spring和Spring MVC包扫描要分开?
- 扫描包
- Spring 自动扫描 不支持jar包 <component-scan> 的解决方案
- 东皇电动车加盟翅膀卫衣
- 测试工具链接整理
- 专访POWER 8编程挑战赛选手黄文超:非专科生的编程算法之路
- ibatis 到 MyBatis区别
- 解决Eclipse无法打开“Failed to load the JNI shared library”
- Spring包扫描
- Linux中安装boost库详解
- 从天猫经营看未来电商的发展趋向
- 【DP|LIS】HDU-1025 Constructing Roads In JGShining's Kingdom
- c语言库函数 strcpy 源碼 实现
- 抛弃Adobe Reader——用ICEpdf来打开你的PDF
- 同学通信录中学生信息包括学号、姓名、联系电话、通讯地址、邮编,请设计程序统计同学录人数功能
- 【Oracle BIEE】 邮件发送功能详解
- 并发环境下延迟加载Singleton实例的终极方案:Initialization-on-demand holder idiom