@ComponentScan注解的排除属性

@ComponentScan注解的排除属性

@ComponentScan组件源码,直截取了用到的属性:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    // 是否使用默认过滤规则:默认为true,被@Component、@Repository、@Service、@Controller锁修饰的组件都会被加入到IOC容器
	boolean useDefaultFilters() default true;

    // 被包含的过滤器集合
	Filter[] includeFilters() default {};

    // 被排除的过滤器集合
	Filter[] excludeFilters() default {};

    
    /** 过滤器 */
	@Retention(RetentionPolicy.RUNTIME)
	@Target({})
	@interface Filter {
		// 过滤类型:默认为注解类型
		FilterType type() default FilterType.ANNOTATION;
        
        // 需要过滤的类型
		@AliasFor("classes")
		Class<?>[] value() default {};

        // 需要过滤的类型
		@AliasFor("value")
		Class<?>[] classes() default {};
        
        // 过滤规则
		String[] pattern() default {};

	}

}


/** 过滤类型 */
public enum FilterType {

    // 注解
	ANNOTATION,

	// 类
	ASSIGNABLE_TYPE,

	// AOP
	ASPECTJ,

	// 正则
	REGEX,

	// 自定义
	CUSTOM
}

我们所需要了解到的核心就是spring加载bean组件时,采用的是一个什么策略,我怎么控制spring加载某个bean组件,反之,我又怎么控制spring不加载某个bean组件,下面这个类中的registerDefaultFilters()方法就是用来接收我们设定的过滤规则集合的:

public class ClassPathScanningCandidateComponentProvider implements EnvironmentCapable, ResourceLoaderAware {
    /** 注册默认的过滤规则集合 */
    protected void registerDefaultFilters() {
            this.includeFilters.add(new AnnotationTypeFilter(Component.class));
            ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
            try {
                this.includeFilters.add(new AnnotationTypeFilter(
                        ((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
                logger.trace("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>) ClassUtils.forName("javax.inject.Named", cl)), false));
                logger.trace("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");
            }
            catch (ClassNotFoundException ex) {
                // JSR-330 API not available - simply skip.
            }
        }

}
	/** 添加需要包含的组件 */
	public void addIncludeFilter(TypeFilter includeFilter) {
		this.includeFilters.add(includeFilter);
	}

	/** 添加需要过滤的组件 */
	public void addExcludeFilter(TypeFilter excludeFilter) {
		this.excludeFilters.add(0, excludeFilter);
	}

到这里,其实我们已经搞懂了spring的默认的过滤规则了,那么如果我们需要排除某个类型的组件该如何操作?过滤组件的原理是在bean组件结果集中排除指定的组件。

useDefaultFilters属性的含义

useDefaultFilters属性用来指定是否按照spring默认的规则加载bean组件,如果该属性的值为【false】,那么被@Component@Repository@Service@Controller所修饰的组件都不会被加入到IOC容器,看到这你应该就明白了,一旦你不按照spring默认的规则加载bean组件,那么你就必须使用includeFilters属性指定需要加入到IOC容器的bean组件,否则IOC容器就是空的。

总结

1、如果需要排除某个组件,只需要指定excludeFilters属性即可

2、一旦不按照spring默认的规则加载bean组件,则必须使用includeFilters属性指定需要加入到IOC容器的bean组件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值