• 每日一面系列之@Component和@Configuration区别


    @Configuration 和 @Component 到底有何区别呢?我先通过如下一个案例,在不分析源码的情况下,小伙伴们先来直观感受一下这两个之间的区别。

    1. @Configuration
    2. public class JavaConfig01 { }
    3. @Component
    4. public class JavaConfig02 { }

    首先,分别向 Spring 容器中注入两个 Bean,JavaConfig01 和 JavaConfig02,其中,JavaConfig01 上添加的是 @Configuration 注解而 JavaConfig02 上添加的则是 @Component 注解。

    现在,在 XML 文件中配置包扫描

    复制代码

    最后,加载 XML 配置文件,初始化容器:

    1. public class Demo {
    2. public static void main(String[] args) {
    3. ClassPathXmlApplicationContext ctx = new
    4. ClassPathXmlApplicationContext("beans_demo.xml");
    5. JavaConfig01 config01 = ctx.getBean(JavaConfig01.class); JavaConfig02 config02
    6. = ctx.getBean(JavaConfig02.class);
    7. System.out.println("config01.getClass() = " + config01.getClass());
    8. System.out.println("config02.getClass() = " + config02.getClass()); } }

    最终打印出来结果如下:

    从上面这段代码中,我们可以得出来两个结论:

    1. @Configuration 注解也是 Spring 组件注解的一种,通过普通的 Bean 扫描也可以扫描到 @Configuration。
    2. @Configuration 注解注册到 Spring 中的 Bean 是一个 CGLIB 代理的 Bean,而不是原始 Bean,这一点和 @Component 不一样,@Component 注册到 Spring 容器中的还是原始 Bean。

    一个问题来了,@Configuration 标记的类为什么注册到 Spring 容器之后就变成了代理对象了呢?闭着眼睛大家也能猜到,肯定是为了通过代理来增强其功能,那么究竟增强什么功能呢?接下来我们通过源码分析来和小伙伴们梳理一下这里的条条框框。

    其实与@Configuration 注解的 Full 模式和 Lite 模式有关

    1. Lite 模式下,配置类中的方法就是普通方法,可以是 final 类型,也可以是 private。

    2. Lite 模式下,不需要通过 CGLIB 生成动态代理类,所以启动速度会快一些。

    3. Lite 模式下,一个 @Bean 方法调用另外一个 @Bean 方法,会导致同一个 Bean 被初始化两次。

    4. Full 模式下,会给配置类生成一个动态代理类,配置类中的所有方法都将被动态代理,因此配置类中的方法不能是 final 或者 private 的。

    5. Full 模式下,一个 @Bean 方法调用另外一个 @Bean 方法,动态代理方法会先去容器中检查是否存在该 Bean,如果存在,则直接使用容器中的 Bean,否则才会去创建新的对象。

  • 相关阅读:
    AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.05-2024.03.10
    革命性创新:RFID技术引领汽车零部件加工新时代
    混合背包问题
    Mybatis-Plus 自定义SQL注入器,实现真正的批量插入![MyBatis-Plus系列]
    关于大数据测试,你一定要试试python的fake库
    C++.I/O流
    新版本下如何通过外部网络访问wsl
    662. 二叉树最大宽度
    阿里P8熬了一个月肝出这份32W字Java面试手册,在Github标星31K+
    10道高频webpack面试题快问快答
  • 原文地址:https://blog.csdn.net/mclongyi/article/details/133740743