[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| Component | n. | /kəmˈpəʊnənt/ | 组件(Spring中的核心概念,指被Spring容器管理的对象。@Component是一个通用注解,用于标识类为Spring组件,使其被容器扫描并创建实例,是@Service、@Controller等注解的父注解) |
| scan | v. / n. | /skæn/ | 扫描(Spring中指"组件扫描",通过@ComponentScan注解或XML配置,让Spring容器自动扫描指定包路径下带有@Component及其派生注解(如@Service)的类,并将其注册为容器中的Bean) |
Lecture04-容器-[实验02]@Component注解的使用
一、操作目标说明

在IoC容器中,最基本的操作就是,把类放入IoC容器,由IoC容器创建其对象
然后再从IoC容器中取出对象来使用
这里需要指出的是,这里我们提到的类,分两种情况:
- 我们自己声明的类:我们可以在源文件中任意修改,比如标记注解等等
- 第三方jar包中的类:类的代码是无法修改的
提问:我这是吃饱了撑的吗?我自己就可以创建对象啊,为什么多此一举放到IoC容器里?
答:Spring Framework所有的功能,都必须基于IoC容器,只有IoC里的对象才能享受到Spring框架提供的各种增强——例如:AOP、声明式事务

二、操作
1、创建类

public class Demo02Comp {
}
2、标记注解
@Component
public class Demo02Comp {
}
3、运行
还是运行主启动类的main()方法

我们从打印bean名称的列表中,看到了“demo02Comp”,这就是我们这个类的对象作为bean的名称,说明它确实被放入IoC容器了
三、相关理论
1、bean名称
bean名称也是bean的id,在IoC容器中每个bean都有这样一个唯一标识
@Component注解的bean id设定:
- 未明确指定时:类名首字母小写,作为 bean 的 id
- 明确指定时:按指定的来
@Component("jian10CENiuBi")
public class Demo02Comp {
}

2、包扫描机制
其实,@Component注解本身并不负责创建对象,它仅仅只是“标记”而已
本质上:所有一切的操作都是 Java 代码来完成的,注解只是告诉框架中的 Java 代码如何执行
举例:元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,红色的地方贴上拉花,黄色的地方贴上气球

班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,后面同学们做的工作,相当于框架的具体操作。
那么框架就需要通过“扫描”的方式来确定哪些地方标记了哪些注解
3、SpringBoot默认扫描范围

- 主启动类所在包
- 主启动类所在包的子包
4、@ComponentScan注解
如果有特殊需要,不能使用默认的包扫描范围,可以使用@ComponentScan注解人为指定:
@SpringBootApplication
@ComponentScan("com.atguigu.spring.demo02")
public class Module21SpringIocApplication {
……
注意:此时默认扫描范围将失效!
注意:@ComponentScan注解需要标记在主启动类或配置类上
注意:如果有需要,@ComponentScan注解可以设置多个值
@SpringBootApplication
@ComponentScan(value = {"com.atguigu.spring.other","com.atguigu.spring.apple"})
public class Module17MainType {