IOC 注解管理bean(注解加扫描和扫描组件)
标记与扫描
注解的作用
①注解
和 XML 配置文件一样,注解本身并不能执行,
注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,
然后针对这个位置按照注解标记的功能来执行具体操作。
本质上:所有一切的操作都是 Java 代码来完成的,XML 和注解只是告诉框架中的 Java 代码如何执行。
举例:元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,
红色的地方贴上拉花,黄色的地方贴上气球。
班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,
后面同学们做的工作,相当于框架的具体操作。
②扫描
Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。
然后根据注解进行后续操作。
注解管理bean(注解和扫描)

@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。
对于Spring使用IOC容器管理这些组件来说没有区别,也就是语法层面没有区别。
所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,
让我们能够便于分辨组件的作用。
注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。
1 . 使用@Component注解标记的普通组件
2 . 使用@Controller注解标记的控制器组件
这个组件就是我们在三层架构中表述层里面,使用的控制器。
以前是Servlet,以后我们将会使用Controller来代替Servlet。
package com.atguigu.spring.controller;
import org.springframework.stereotype.Controller;
3 . 使用@Service注解标记的业务逻辑组件
这个组件就是我们在三层架构中使用的业务逻辑组件。
package com.atguigu.spring.service.imp;
import com.atguigu.spring.service.UserService;
import org.springframework.stereotype.Service;
import javax.swing.plaf.UIResource;
4 . 使用@Repository注解标记的持久化层组件
这个组件就是我们以前用的Dao类,但是以后我们整合了Mybatis,
这里就变成了Mapper接口,而Mapper接口是由Mybatis和Spring的整合包负责扫描的。
是Mybatis和Spring的整合包来完成,将来由Mybatis负责扫描,
也不使用@Repository注解。package com.atguigu.spring.dao.impl;
import com.atguigu.spring.dao.UserDao;
import org.springframework.stereotype.Repository;
xml文件进行扫描
<!--为什么扫描:类上加上注解,spring不知道就白搭,所以一定要spring知道哪些类加了注解,加了什么注解-->
<!-- 扫描组件 -->
<!-- 通过包来扫描的,包下面所有类进行扫描 -->
<context:component-scan base-package="com.atguigu.spring"></context:component-scan>
/**
* @Component:将类标识为普通组件:就是把当前加上注解这个类作为一个bean被IOC管理
* @Controller:将类标识为控制层组件
* @Service:将类标识为业务层组件
* @Repository:将类标识为持久层组件
* 可以将扫描的包下面加上注解这些类作为主键(就是在ioc有了当前加上注解这个类所对应的bean对象)
* 注意:功能一样都是将有一个类标识为组件,但是含义不一样
*/
注解管理bean(扫描组件)
指定要排除的组件:
<!--
以后ssm整合的时候,spring和springMVC是放在一块使用的,而springMVC扫描的是控制层
spring扫描的是除控制层以外的所有组件
如果spring和springMVC都扫描了,一个组件扫描多次,
现在做的就是springMVC扫描控制层,spring其余组件进行扫描
怎么做;在扫描组件标签里面有两个子标签
第一种方法:
context:exclude-filter:排除扫描,(不扫描谁)也是用的比较多
type(排除扫描的方式):"annotation/ assignable"
annotation:根据注解类型进行排除(常用)
assignable:根据类的类型进行排除
expression: 需要设置排除的注解的全类名/设置排除类的全类名
-->
<context:component-scan base-package="com.atguigu.spring" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
仅扫描指定组件:
<context:component-scan base-package="com.atguigu.spring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
第二中方法:
context:include-filter:包含对某些组件扫描(只扫描谁)
为什么没效果:因为默认情况下会把包下面这些所有的类都进行扫描
注意:需要在context:component-scan标签中设置use-default-filters="false"
默认值true,所设置的包下所有的类都需要扫描,可以使用排除扫描
设置为false,所设置的包下所有的类不需要扫描,此时可以使用包含排除扫描
-->
通过注解加扫描配置的bean的id默认值为类的小驼峰,类名首字母为小写的结果
可以通过标识组件的注解的value属性值设置bean的自定义id
浙公网安备 33010602011771号