注解标识组件
- @Component
标识一个受Spring IOC容器管理的普通组件 - @Repository (dao)
标识一个受Spring IOC容器管理的持久化层组件 - @Service (service)
标识一个受Spring IOC容器管理的业务逻辑层组件 - @Controller (servlet)
标识一个受Spring IOC容器管理的表述层控制器组件 - 组件命名规则
a)默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
b)我们可以使用组件注解的value属性指定bean的id,value属性名可以省略
注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将 @Respository注解用在一个业务逻辑层组件上面也不会产生任何错误,所以@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。
组件扫描
注意:通过注解的方式管理Bean还需要在原有jar包的基础上导入spring-aop-5.3.1.jar
指定被扫描的包
<!--配置自动扫描的包
base-package属性:指定一个基础包,Spring会自动扫描该包及其子包
resource-pattern属性:精确指定扫描那个包下的类
-->
<context:component-scan base-package="com.atguigu.annotion" >
设置扫描的类
注意:让子标签context:include-filter起作用的前提需要将父标签的use-default-filters属性设置为false,禁用默认过滤器。
注意:需要将父标签的use-default-filters的值设置为false
如果type的值是annotation,那么expression的值是注解的全类名
如果type的值是assignable,那么expression的值是接口或实现类的全类名
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:include-filter type="assignable" expression="com.atguigu.spring.annotation.dao.UserDao"/>
设置不扫描的类
<context:component-scan base-package="com.atguigu.spring.annotation">
<!--
★子标签context:exclude-filter:用来设置不扫描那个包下的类
如果type的值是annotation,那么expression的值是注解的全类名
注意:不能排除@Component注解,因为其他三个注解上都添加了该注解
如果type的值是assignable,那么expression的值是接口或实现类的全类名
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:exclude-filter type="assignable" expression="com.atguigu.spring.annotation.dao.impl.UserDaoImpl"/>
</context:component-scan>