组件扫描 Spring能够从classPath下自动扫面,侦测和实例化具有特点注解的组件
特定组件包括:(标识在类上)
- @Component 基本注解,标识一个受spring管理的组件
- @Repository 标识持久层组件
- @Service 标识服务层(业务层)组件
- @Controller 标识表现层组件
对于扫描到的组件,spring有默认的命名规则:使用非限定类名,第一个字母小写,也可以通过value属性标识组件的名称
代码:
在note包下:
package note;
import org.springframework.stereotype.Component;
@Component("testPojo")
public class TestPojo {
}
配置文件:
<context:component-scan base-package="note"></context:component-scan>
配置文件的过滤
指定扫描的包 扫描这个包下的所有子包
<context:component-scan base-package="note"></context:component-scan>
使用属性resource-pattern 过滤只扫描指定的类
<!--resource-pattern 过滤只扫描指定的类 -->
<context:component-scan base-package="note" resource-pattern="son/*.class"></context:component-scan>
使用文件的过滤使用:context:component-scan 子节点
context:exclude-filte:指定排除那些组件
context:include-filter:指定只包含那些组件
它们都有共同的属性 type 来指定使用什么方式来排除或包含
- type="annotation" 根据注解
- type="assignable" 根据接口或者类
共同属性 expression指定目标注解 或 类
- context:exclude-filter指定排除那些组件:子节点的属性 type="annotation"根据注解不包含 expression属性指定的
<!-- context:exclude-filter指定排除那些组件:子节点的属性 type="annotation"根据注解不包含 expression属性指定的 -->
<context:component-scan base-package="note">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Component" />
</context:component-scan>
- context:exclude-filter指定排除那些组件:子节点的属性 type="assignable"根据接口或者类型不包含 expression属性指定的
<!-- context:exclude-filter指定排除那些组件:子节点的属性 type="assignable"根据接口或者类型不包含 expression属性指定的-->
<context:component-scan base-package="note">
<context:exclude-filter type="assignable"
expression="note.son.TestPojoA" />
</context:component-scan>
- context:include-filter指定只包含那些组件: 去掉默认filter只是用指定的filter use-default-filters="false"
<!-- context:include-filter指定只包含那些组件: 去掉默认filter只是用指定的filter use-default-filters="false" -->
<context:component-scan base-package="note " use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
</context:component-scan>