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

news2024/10/7 12:29:38

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

@Configuration

public class JavaConfig01 { }

@Component

public class JavaConfig02 { }

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

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

复制代码

<context:component-scan base-package="org.javaboy.demo.p6"/>

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

public class Demo {
  public static void main(String[] args) {
    ClassPathXmlApplicationContext ctx = new 
   ClassPathXmlApplicationContext("beans_demo.xml"); 
    JavaConfig01 config01 = ctx.getBean(JavaConfig01.class); JavaConfig02 config02 
     = ctx.getBean(JavaConfig02.class); 
     System.out.println("config01.getClass() = " + config01.getClass()); 
     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,否则才会去创建新的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见算法-双骰子游戏(Craps)

常见算法-双骰子游戏&#xff08;Craps&#xff09; 1、说明 一个简单的双骰子游戏&#xff0c;游戏规则如下&#xff1a; 玩家掷两个骰子&#xff0c;点数为1到6&#xff0c; 如果第一次点数和为7或11&#xff0c;则玩家胜&#xff0c;如果点数和为2、3或12&#xff0c;则…

使用Jetson AGX Orin进行口罩识别

在 https://gitee.com/gpus/maskDetection_jetson 代码仓有个口罩识别的案例&#xff0c;我们来看看能不能在Jetson AGX Orin上搞定。 先将该代码仓fork到自己的代码仓&#xff08;以便魔改&#xff09; 回到自己的代码仓&#xff1a; 根据README.md来操作吧&#xff01; 首先…

Feign(替代RestTemplate)远程调用

Feign初步学习 定义 Feign 是一个基于 Java 的 HTTP 客户端库&#xff0c;它是 Spring Cloud 中的一部分&#xff0c;用于简化微服务之间的 HTTP 通信。与传统的使用 RestTemplate 来调用 RESTful 服务不同&#xff0c;Feign 提供了一种声明式、基于接口的方式来定义和调用 H…

YB2419是一款功能齐备,内置mos100%占空比高效率同步降压IC

产品描述: YB2419是一款功能齐备&#xff0c;应用极为简单&#xff0c;并兼顾应用的灵活性和广泛性&#xff0c;高性能&#xff0c;以及超高性价比的恒压恒流降压型DC-DC可持续输出4.2A,支持两路USB口同时输出。是一款输入耐压可达40V,4.5-40V输入电压条件正常工作&#xff0c…

基于SpringBoot的厨艺交流平台设计与实现

目录 前言 一、技术栈 二、系统功能介绍 食材分类管理 用户信息管理 菜谱分类管理 菜谱信息管理 食材信息管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息…

查找算法——二分查找法

一、介绍 首先需要将查找的数据排好序&#xff0c;再进行二分查找法来进行查找&#xff0c;二分查找是将数据范围不断分割为两份&#xff0c;不断比较中间值与待查找值的大小来确定其在哪个区间范围的一种方法。例如&#xff1a;在一组数据&#xff08;1&#xff0c;4&#xff…

零基础Linux_14(基础IO_文件)缓冲区+文件系统inode等

目录 1. 缓冲区 1.1 缓冲区的存在 1.2 缓冲区的刷新策略 1.3 模拟C标准库中的文件操作 完整代码及验证&#xff1a; 1.4 重看缓冲区 1.5 stdout和stderr的区别 2. 文件系统 2.1 磁盘的物理结构CHS等 2.2 磁盘的抽象结构LBA等 2.3 文件管理inode等 2.4 对文件的操作…

Bytebase 2023 第三季度回顾

开工快乐&#xff01;2023 的第三个季度转眼过去了&#xff0c;一起来看看 Bytebase 过去几个月干得如何&#xff1f; &#x1f4f0; 公司动态 Bytebase 突破百万下载。和 GitLab 签署 Technology Partner 技术合作伙伴协议。中东 Shopify 使用 Bytebase 构建一站式数据库开发…

节能减排 | AIRIOT智慧工厂节能管理解决方案

工厂作为高能耗的生产型企业&#xff0c;降低能耗和提升资源利用率方面就显得很重要&#xff0c;对实施国家倡导的节能降耗、绿色发展有着很大程度上的必要性。然而&#xff0c;工厂能源管理从传统手段向智能化升级转型的过程中&#xff0c;企业也不可避免的面临一些痛点和挑战…

在线刷题答题小程序开发现成源码搭建 功能丰富 支持在线考试+刷题 源码开源可二开

在线考试和刷题成为了学习的一种趋势&#xff0c;越来越多的人开始通过在线平台进行自我学习和提升。为了满足这一需求&#xff0c;开发一款功能丰富、支持在线考试和刷题的答题小程序成为了热门的需求。分享一款在线刷题答题小程序源码&#xff0c;功能丰富&#xff0c;支持在…

分布式搜索系统的设计

介绍 如今&#xff0c;我们几乎在每个网站上都看到一个搜索栏。搜索栏使我们能够快速找到我们需要的内容。 让我们举个例子。想象一下&#xff0c;如果YouTube没有提供搜索栏&#xff0c;我们如何在数百万个视频中找到特定的视频&#xff0c;这些视频多年来都已上传到YouTube&a…

【git merge/rebase】详解合并代码、解决冲突

目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 1.概述 在实际开发中&#xff0c;一个项目往往是多个人一起协作的&#xff0c;头天下班前大家把代码交到远端仓库&#xff0c;第二天工作的第一件事情都是从服务器上拉最新的代码&#xff0c;保证代码版本…

【pytorch】模型的保存与加载|| Dataloader数据加载器

Pytorch模型保存与加载&#xff0c;并在加载的模型基础上继续训练 系统学习Pytorch笔记三&#xff1a;Pytorch数据读取机制(DataLoader)与图像预处理模块(transforms) 一、只保存参数 1. 保存 一般地&#xff0c;采用一条语句即可保存参数&#xff1a; torch.save(model.s…

UI设计师岗位的基本职责八篇

UI设计师岗位的基本职责1 职责&#xff1a; 1. 负责公司互联网产品app、web、h5等的用户界面设计工作; 2. 负责运营活动相关的平面及视频设计支持; 3. 负责完成产品相关的界面、图标、动画等的图形界面设计&#xff0c;并参与制定、编写产品视觉设计规范文档; 4. 整理和分…

解决yolo无法指定显卡的问题,实测v5、v7、v8有效

方法1 基本上这个就能解决了&#xff01;&#xff01;&#xff01; 在train.py的最上方加上下面这两行&#xff0c;注意是最上面&#xff0c;其次指定的就是你要使用的显卡 import os os.environ[CUDA_VISIBLE_DEVICES]6方法2&#xff1a; **问题&#xff1a;**命令行参数指…

数字化营销系统有什么优势?免费数字化营销系统推荐

数字化营销系统的优势在于其多方面的性能。首先&#xff0c;它可以帮助企业降低成本&#xff0c;其次&#xff0c;数字化营销系统还能提高市场推广收益情况的跟踪能力。通过精准定位和智能推荐&#xff0c;企业可以将信息传递给更有可能转化为实际购买力的潜在客户。如蚓链数字…

java加密使用

加解密 概念算法分类对称加解密算法非对称加解密算法信息摘要算法 数字签名和消息验签数字签名过程消息验签过程数字签名分类 AES使用生成秘钥使用秘钥加解密 RSA使用生成公私钥加密、加签、验签、解密 SM2使用将公钥和私钥证书文件转化为字符串存储 概念 算法分类 对称加解密…

Qt编程-QTableView冻结行或冻结列或冻结局部单元格

前言 Qt编程-QTableView冻结行或冻结列或冻结局部单元格。如题&#xff0c;先看效果是不是你需要的。网上找到的代码片段要么不全要么不是想要的。如果你需要同时冻结行和列的效果&#xff0c;请看下篇博客 Qt编程-QTableView同时冻结行和列。 冻结列&#xff1a; 冻结行&a…

[stm32]外中断控制灯光

在STM32CubeMX中配置外部中断功能和参数 1、将上拉输入的引脚设置为&#xff1a;GPIO_EXTI功能 2、GPIO模式设为下降沿触发外部中断&#xff0c;使能上拉电阻&#xff0c;用户标签 3、要将NVIC的相关中断勾选 只有将中断源进行勾选&#xff0c;相关的中断请求才能得到内核的…

华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…