Lecture04-容器-[实验02]@Component注解的使用

文章目录

    [toc]

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

    Lecture04-容器-[实验02]@Component注解的使用

    一、操作目标说明

    image-20251103140103618

    在IoC容器中,最基本的操作就是,把类放入IoC容器,由IoC容器创建其对象

    然后再从IoC容器中取出对象来使用

    这里需要指出的是,这里我们提到的类,分两种情况:

    • 我们自己声明的类:我们可以在源文件中任意修改,比如标记注解等等
    • 第三方jar包中的类:类的代码是无法修改的

    提问:我这是吃饱了撑的吗?我自己就可以创建对象啊,为什么多此一举放到IoC容器里?

    答:Spring Framework所有的功能,都必须基于IoC容器,只有IoC里的对象才能享受到Spring框架提供的各种增强——例如:AOP、声明式事务

    image-20250522233907439


    二、操作

    1、创建类

    image-20250523000233035

    public class Demo02Comp {
    }
    

    2、标记注解

    @Component
    public class Demo02Comp {
    }
    

    3、运行

    还是运行主启动类的main()方法

    image-20250523000404877

    我们从打印bean名称的列表中,看到了“demo02Comp”,这就是我们这个类的对象作为bean的名称,说明它确实被放入IoC容器了


    三、相关理论

    1、bean名称

    bean名称也是bean的id,在IoC容器中每个bean都有这样一个唯一标识

    @Component注解的bean id设定:

    • 未明确指定时:类名首字母小写,作为 bean 的 id
    • 明确指定时:按指定的来
    @Component("jian10CENiuBi")
    public class Demo02Comp {
    }
    

    image-20250523000510049


    2、包扫描机制

    其实,@Component注解本身并不负责创建对象,它仅仅只是“标记”而已

    本质上:所有一切的操作都是 Java 代码来完成的,注解只是告诉框架中的 Java 代码如何执行

    举例:元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,红色的地方贴上拉花,黄色的地方贴上气球

    img015

    班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,后面同学们做的工作,相当于框架的具体操作。


    那么框架就需要通过“扫描”的方式来确定哪些地方标记了哪些注解


    3、SpringBoot默认扫描范围

    image-20250908092410835

    • 主启动类所在包
    • 主启动类所在包的子包

    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 {
    
    end