在使用scan功能时,默认情况下所有的构造型注解标注(@Component,@Service,@Repository,@Controller)的实现类都会被注册为bean
但是在具有限定功能的情况下,可以减小Spring扫描的粒度,提升效率。
下面的规则都可以分为正向的和反向的,即该类型的需要扫描以及该类型的不需要扫描。
<context:component-scan base-package=”被扫描的包路径”>
正向的写在
<context:include-filter type=”5种情况” expression=”如下所示”/>
反向的写在
<context:exclude-filter type=”5种情况” expression=”如下所示”/>
如果应用扫描的话,默认是需要加注解的,但是在非annotation限定模式下则可以不加注解也可以自动识别,具体看下面的例子。
1、type=annotation,必须由注解,过滤器扫描使用指定注解所标注的那些类。具体来说,就是@Component,@Service,@Repository,@Controller这几个构造型注解所在的类。
expression=有4个值,这种限定方式是必须有@Component等注解的。
org.springframework.stereotype.Component;
org.springframework.stereotype.Controller;
org.springframework.stereotype.Repository;
org.springframework.stereotype.Service;
2、type=assignable,注解不是必要的,过滤器扫描派生于expression属性所指定类型的那些类,所谓的派生,具体的实现类的路径。
expression=接口类路径
3、type=aspectj,过滤器扫描与expression属性所指定的AspectJ表达式所匹配的那些类。
4、type=custom,使用自定义的org.springframework.core.type.TypeFilter实现类,该类由expression属性指定。
5、type=regex,过滤器扫描类的名称与expression属性所指定的正则表达式所匹配的那些类。
我们一般是用maven构建项目,在使用spring加载时,有的时候某些maven module不想把某些路径的类加载进来;或者有些时候由于加载冲突;或者有二次加载等等问题时,就需要exclude一些包。下面的例子:加载组件时,把com.iqiyi.ttbrain.base.dao.db.impl路径下的java组件忽略掉。
<!-- 注解方式的aop -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 自动搜索Sping的注解类-->
<context:component-scan base-package="com.iqiyi.ttbrain" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="regex" expression="com.iqiyi.ttbrain.base.dao.db.impl.*"/>
</context:component-scan>
举例:http://blog.csdn.net/bestcxx/article/details/52620482