spring中的@Configuration注解详解
一、概述与核心作用
@Configuration
是Spring框架中用于定义配置类的核心注解,旨在替代传统的XML配置方式,通过Java代码实现Bean的声明、依赖管理及环境配置。其核心作用包括:
- 标识配置类:标记一个类为Spring的配置类,容器启动时会自动解析其中的Bean定义。
- 定义Bean:通过
@Bean
注解的方法声明Spring管理的Bean实例。 - 依赖管理:支持通过构造函数或字段注入其他Bean,实现依赖关系的自动装配。
- 条件化配置:结合
@Conditional
等注解,根据环境或属性动态决定Bean的创建。 - 模块化配置:通过
@Import
导入其他配置类,实现配置的分层与复用。
二、底层实现原理
-
配置类解析机制
Spring通过ConfigurationClassPostProcessor后置处理器解析@Configuration
类,分为三个阶段:-
解析阶段:扫描类中的
@Bean
方法及依赖关系,生成BeanDefinition
对象。 -
注册阶段:将
BeanDefinition
注册到IoC容器中。 -
验证阶段:检查配置的合法性(如循环依赖)。
-
-
单例保证与代理机制
Spring默认使用CGLIB动态代理为配置类生成子类,确保:-
@Bean
方法调用返回同一实例(单例模式)。 -
避免直接调用
@Bean
方法导致多次实例化问题。
-
-
条件化配置实现
结合@Conditional
注解,通过实现Condition
接口的matches()
方法,根据环境变量、属性文件等条件动态加载Bean。
三、使用示例与语法
-
基本配置类
@Configuration public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();} }
@Bean
方法返回的实例由Spring管理,默认单例。
-
依赖注入示例
@Configuration public class ServiceConfig {@Autowiredprivate DataSource dataSource;@Beanpublic UserService userService() {return new UserServiceImpl(dataSource);} }
• 支持字段注入或构造函数注入依赖。
-
条件化Bean定义
@Configuration public class EnvConfig {@Bean@ConditionalOnProperty(name = "env.mode", havingValue = "dev")public DataSource devDataSource() {return new DevDataSource();} }
- 仅在
env.mode=dev
时创建该Bean。
- 仅在
四、高级特性与最佳实践
-
模块化配置
将不同功能的配置拆分到多个类(如DataConfig
、WebConfig
),通过@Import
组合:@Configuration @Import({DataConfig.class, ServiceConfig.class}) public class MainConfig {}
-
外部化属性配置
使用@PropertySource
加载属性文件,并通过@Value
注入:@Configuration @PropertySource("classpath:application.properties") public class AppConfig {@Value("${app.name}")private String appName; }
-
避免硬编码与手动实例化
• 优先通过@ComponentScan
自动扫描组件,减少显式@Bean
定义。• 禁止在配置类中手动
new Bean()
,否则绕过Spring生命周期管理。 -
处理有参构造函数
• 若配置类存在有参构造,需通过@Bean
方法显式实例化或使用@Autowired
依赖注入:@Configuration public class MyConfig {@Beanpublic MyBean myBean(String param) {return new MyBean(param);} }
五、注意事项与常见问题
-
循环依赖
配置类中若Bean A依赖Bean B,且B也依赖A,需通过@Lazy
延迟加载或重构代码结构。 -
代理模式的影响
若需禁用CGLIB代理(如测试场景),可通过@Configuration(proxyBeanMethods = false)
关闭,但需注意单例失效风险。 -
多环境配置
结合@Profile
注解区分不同环境的Bean定义(如开发、生产)。
六、@Configuration注解与@Component注解的区别
在Spring框架中,@Configuration
和@Component
都是用于定义Spring Bean的注解,但它们在用途、行为和设计目的上有显著的区别。以下是两者的主要区别:
1. 核心用途与设计目的
-
@Configuration
- 用途:用于标记一个类是配置类,通常用于定义Bean的创建逻辑和依赖关系。
- 设计目的:通过
@Bean
方法显式声明Bean,支持复杂的Bean初始化逻辑(如条件判断、依赖注入、方法调用等)。 - 适用场景:需要集中管理Bean定义、支持编程式配置或动态配置时。
-
@Component
- 用途:用于标记一个类是Spring管理的组件(如服务、DAO、工具类等)。
- 设计目的:通过类扫描自动发现Bean,简化配置。
- 适用场景:普通组件类,无需复杂初始化逻辑。
2. Bean的创建方式
-
@Configuration
- 通过
@Bean
方法显式定义Bean。 - 关键行为:
- 默认使用CGLIB代理,确保
@Bean
方法在同一个配置类中多次调用时返回同一个Bean实例(避免重复创建)。 - 支持方法间的依赖注入(例如,一个
@Bean
方法可以调用另一个@Bean
方法)。
- 默认使用CGLIB代理,确保
- 示例:
@Configuration public class AppConfig {@Beanpublic ServiceA serviceA() {return new ServiceA();}@Beanpublic ServiceB serviceB() {// 依赖注入serviceAreturn new ServiceB(serviceA());} }
- 通过
-
@Component
- 通过类扫描自动注册Bean。
- 关键行为:
- 不支持
@Bean
方法,Bean的创建逻辑通常在类的构造函数或初始化方法中定义。 - 如果需要依赖其他Bean,通过
@Autowired
注入。
- 不支持
- 示例:
@Component public class MyService {private final Dependency dependency;@Autowiredpublic MyService(Dependency dependency) {this.dependency = dependency;} }
3. 代理机制
-
@Configuration
- 使用CGLIB代理,确保
@Bean
方法在同一个配置类中多次调用时返回同一个实例。 - 示例:
@Configuration public class Config {@Beanpublic BeanA beanA() {return new BeanA();}@Beanpublic BeanB beanB() {// 多次调用beanA()返回同一个实例return new BeanB(beanA(), beanA()); } }
- 使用CGLIB代理,确保
-
@Component
- 不使用代理,直接实例化类。如果类中包含方法调用(非
@Bean
方法),每次调用都会创建新实例。 - 示例:
@Component public class MyComponent {public BeanA createBeanA() {return new BeanA(); // 每次调用都会创建新实例} }
- 不使用代理,直接实例化类。如果类中包含方法调用(非
4. 适用场景对比
场景 | 推荐使用 | 原因 |
---|---|---|
集中管理Bean定义 | @Configuration | 支持@Bean 方法、方法间依赖、条件化配置等。 |
普通组件类 | @Component | 简化配置,通过类扫描自动发现。 |
动态Bean初始化逻辑 | @Configuration | 可以通过@Bean 方法实现条件判断、环境依赖等复杂逻辑。 |
静态Bean定义 | @Component | 适合无复杂逻辑的组件类。 |
测试或Mock配置 | @Configuration | 方便在测试中覆盖或替换Bean。 |
5. 其他相关注解
@Component
的派生注解:@Service
、@Repository
、@Controller
等都是@Component
的特化版本,功能相同,但语义更明确。
@Configuration
的扩展:@Profile
:结合@Configuration
实现条件化配置。@Import
:导入其他配置类。
6. 总结
@Configuration
:用于配置类,支持@Bean
方法和复杂Bean初始化逻辑,适合集中管理Bean定义。@Component
:用于普通组件类,通过类扫描自动注册,适合简单组件。
选择建议:
- 如果需要定义Bean的创建逻辑或管理依赖关系,使用
@Configuration
。 - 如果只是标记一个普通类为Spring Bean,使用
@Component
或其派生注解(如@Service
)。
总结
@Configuration
注解是Spring实现Java-Based配置的核心工具,通过动态代理、条件化加载和模块化设计,简化了Bean管理与依赖注入流程。合理使用其特性可显著提升代码的可维护性与灵活性,同时需注意避免循环依赖和硬编码问题。
spring中的@bean注解详解
相关文章:
spring中的@Configuration注解详解
一、概述与核心作用 Configuration是Spring框架中用于定义配置类的核心注解,旨在替代传统的XML配置方式,通过Java代码实现Bean的声明、依赖管理及环境配置。其核心作用包括: 标识配置类:标记一个类为Spring的配置类,…...
AI中常用概念的理解
1. RAG(检索增强生成) 通俗理解:就像你写作业时,先查课本 / 百度找资料,再根据资料写答案,而不是纯靠记忆瞎编。 AI 模型(比如 ChatGPT)回答问题时,先去 “数据库 / 互联…...
JWT GenTokenParseToken
JWT(Json Web Token) 获取Token、解密Token jwt.go package jwtimport ("errors""time""github.com/golang-jwt/jwt/v5" )var jwtSecret []byte("secret")type CustomClaims struct {Username string json:"username"jw…...
ROS:发布相机、IMU等设备消息主题
文章目录 📚简介📷发布相机消息主题🌐网络相机🚀RTSP🔌串口设备🧩 踩坑📚简介 使用ROS系统录制rosbag包,需要发布设备消息主题,才能使用rosbag record命令录制rosbag包。 📷发布相机消息主题 获取相机视频流的方式有多种,主要包含: 网络相机,使用RTSP…...
C++好用的打印日志类
在项目中,调试打印十分重要,这里分享一个自己写的简单但是实用的打印日志类,控制台打印时间戳具体内容保存文件 1.相关库介绍及其基本用法 a.<iostream> 功能:提供基本的输入输出流功能,如std::cout用于控制台输出,std::cin用于控制台输…...
晶振:从消费电子到航天领域的时间精度定义者
从手表到卫星:晶振如何在不同领域定义时间精度 在时间的长河中,人类对时间精度的追求永无止境。从古老的日晷到如今精密的计时仪器,每一次进步都离不开技术的革新。而晶振,作为现代计时的核心元件,在不同领域发挥着至…...
huggingface下载数据和模型,部分下载,本地缓存等常见问题踩坑
huggingface 注:系统环境为windows11 23H2,macOS和Linux用户可以查看下【参考】里的链接文档,差异不大 安装huggingface-cli 虽然可以通过代码下载模型和数据集(下文会提及),但我依然推荐你用此方法来管理…...
分布式架构:Dubbo 协议如何做接口测试
传统单体架构是一个应用程序进程内处理完所有的逻辑:一个系统糅合了多个功能,如注册 --登录–充值–余额管理–用户积分等,所有的功能模块都是在一个应用程度里处理完的;一个请求过来–> 到应用程序系统–>数据库处理–>…...
Python math 库教学指南
Python math 库教学指南 一、概述 math 库是 Python 标准库中用于数学运算的核心模块,提供以下主要功能: 数学常数(如 π 和 e)基本数学函数(绝对值、取整等)幂与对数运算三角函数双曲函数特殊函数&…...
Antd Upload组件连续回车会多次触发文件夹弹窗的bug修复
看了看issue一大堆,没一个解决的,真恼火:Upload 上传组件,当上传完一个文件后,我按下键盘回车键,自动又打开了“选择文件窗口”,点击“选择文件窗口”下面的取消按钮,再次打开了“选…...
数据仓库与数据湖的对比分析
目录 一、数据来源 数据仓库 数据湖 二、数据模式转换时机 数据仓库 数据湖 三、数据存储成本 数据仓库 数据湖 四、数据质量 数据仓库 数据湖 五、面向用户 数据仓库 数据湖 六、主要支撑的应用类型 数据仓库 数据湖 在企业数据管理领域,数据仓库…...
Windows系统下MinerU的CUDA加速配置指南
Windows系统下MinerU的CUDA加速配置指南 快速解锁GPU性能,提升文档解析效率 1、简介 MinerU是一款高效的文档解析工具,支持通过CUDA加速显著提升处理速度。本指南详细说明如何在Windows系统中配置CUDA环境,并启用MinerU的GPU加速功能,帮助用户充分利用NVIDIA显卡的计算能…...
LeetCode路径总和系列问题解析:I、II、III的解决方案与优化
文章目录 引言一、路径总和 I(LeetCode 112)问题描述方法思路Java代码实现复杂度分析 二、路径总和 II(LeetCode 113)问题描述方法思路Java代码实现复杂度分析 三、路径总和 III(LeetCode 437)问题描述方法…...
【漫话机器学习系列】233.激活阈(Threshold Activation)
深度学习入门:了解“阈值激活函数”(Threshold Activation Function) 激活函数是神经网络中至关重要的一环。今天,我们通过一幅简单直观的手绘图,一起理解最早期也最基础的激活函数之一 —— 阈值激活函数(…...
使用vue开发electron
1.全局安装electron npm i electron -g 查看是否安装成功 electron -v 在vue项目中添加electron模块 vue add electron-builder 添加成功后,目录中多了background.js文件 可以在background.js配置 例如 窗口大小,是否可以缩放,是否可以移…...
安全企业内部im,BeeWorks即时通讯
BeeWorks企业即时通讯软件具备哪些优势? 1. 多样的沟通方式 文本消息:支持发送文字消息,包括富文本格式(如加粗、斜体、下划线、颜色等)。 语音消息:支持发送语音消息,方便快捷,适…...
网易爆米花 1.8.8 | 免费无广告,支持多网盘聚合和智能刮削技术,提供顶级画质和逼真音效的影视管理应用
网易爆米花TV是一款专为家庭设计的影视管理应用,旨在提供一个简洁易用的家庭影视库。它支持从多个网盘(如阿里、百度、天翼等)、WebDAV以及本地资源导入,聚合用户的影视资源,并通过智能刮削技术将视频信息形成精美的影…...
蓝牙语音遥控国产适用芯片HS6621
蓝牙语音遥控器一般是通过按下语音键,遥控器会发送一个 HID 编码通知智能电视或者机顶盒打开识音功能,此时,遥控器LED灯保持闪烁或者长亮,用户开始录音同时将语音数据上传给智能电视或者机顶盒。而智能电视或者机顶盒,…...
【Vue2】1-创建一个Vue实例
Vue2官方文档 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…...
销售与金融领域的数据处理与分析方法
一、引言 在销售和金融领域,除了常见的同比、环比和移动平均等数据处理方法外,还有众多方法可供选择,这些方法分布于不同的专业方向,旨在帮助分析和解决问题,以下将按类别对这些方法进行详细梳理。 二、按类别划分的…...
DataWorks Copilot 集成 Qwen3-235B-A22B混合推理模型,AI 效能再升级!
刚刚,阿里云一站式智能大数据开发治理平台 DataWorks 正式接入 Qwen3 模型,可支持235B最大尺寸。用户通过 DataWorks Copilot 智能助手即可调用该模型,通过自然语言交互完成多种代码操作,实现数据开发、数据分析的快速实现。 Qwen…...
芯片软错误概率探究:基于汽车芯片安全设计视角
摘要: 本文深入剖析了芯片软错误概率问题,结合 AEC-Q100 与 IEC61508 标准,以 130 纳米工艺 1Mbit RAM 芯片为例阐述其软错误概率,探讨汽车芯片安全等级划分及软错误对汽车关键系统的影响,分析先进工艺下软错误变化趋势…...
青少年抑郁症患者亚群结构和功能连接耦合的重构
目录 1 研究背景及目的 2 研究方法 2.1 数据来源与参与者 2.1.1 MDD患者: 2.1.2 健康对照组: 2.2 神经影像分析流程 2.2.1 图像采集与预处理: 2.2.2 网络构建: 2.2.3 区域结构-功能耦合(SC-FC耦合)…...
汽车OTA在线升级法规分析
摘要 本文介绍了R156法规即《关于批准车辆的软件升级和软件升级管理体系统一规定的法规》、该法规专注于汽车软件升级功能,并为此提出了一系列具体要求,旨在确保软件升级流程的安全性、可控性和合规性,从而顺应汽车行业智能化、联网化的发展趋…...
【上海大学数据库原理实验报告】MySQL基础操作
实验目的 熟悉MySQL基础操作。 实验内容 创建四张工程项目的关系表。 图 1 四张工程项目关系表的结构 检索供应零件编号为J1的工程的供应商编号SNO。检索供应零件给工程J1,且零件编号为P1的供应商编号SNO。查询没有正余额的工程编号、名称及城市,结果…...
FUSE 3.0.0 | 聚合7大直播平台的免费电视直播软件,支持原画清晰度及弹幕、收藏功能
FUSE是一款第三方娱乐直播软件,它聚合了多个直播平台的内容,为用户提供丰富的观看选择。首次进入软件后点击左上角logo,然后点击‘我已诚信付款,解锁LIVEPRO’按钮即可解锁所有功能。该软件聚合了7大直播平台,每个平台…...
在企业微信中,回调地址 redirect_uri 是允许包含端口号
在企业微信中,回调地址(redirect_uri)允许包含端口号的原因主要有以下几点: 1. 企业微信的开放设计 企业微信对回调地址的校验相对灵活,允许开发者根据实际业务需求配置带端口号的域名。这与部分严格限制端口的平台&a…...
Rust 学习笔记:枚举与模式匹配
Rust 学习笔记:枚举与模式匹配 Rust 学习笔记:枚举与模式匹配定义枚举(Enum)枚举变量Option 枚举及其相对于 NULL 的优势match 和枚举与 Option\<T\> 匹配match 应该是详尽的Catch-all 模式和 _ 占位符使用 if let 和 let e…...
UI自动化测试的优势
1. UI自动化测试的优势(提升效率的场景) ✅ 适合自动化的场景 (1) 高频回归测试 典型场景:每次版本迭代都要验证的核心功能(如登录、支付流程)。 效率提升:自动化脚本执行速度远高于手动测试,尤其适合敏捷开发中的快速验证。 (2) 跨平台/多环境测试 典型场景:需要在不…...
【Android】轻松实现实时FPS功能
文章目录 实时FPS 实时FPS 初始化 choreographer Choreographer.getInstance();lastFrameTimeNanos System.nanoTime();choreographer.postFrameCallback(frameCallback);监听并显示 Choreographer.FrameCallback frameCallback new Choreographer.FrameCallback() {Overri…...
BI平台是什么意思?一文讲清BI平台的具体应用!
目录 一、BI平台是什么意思 1. 基本概念 2. 核心功能 3. 重要性 二、BI平台的分类 1. 按部署方式分类 2. 按功能特点分类 3. 按行业应用分类 三、BI平台的使用场景 1. 销售与营销分析 2. 财务分析 3. 人力资源管理 4. 供应链管理 5. 运营管理 总结 “BI 平台是什…...
玩转MCP
玩转MCP 0.环境1.自定义stdio交互1.1.server1.2.client1.3.效果 2.自定义sse交互2.1.server2.2.client2.3.效果 3.使用官方文件 mcp火了好一阵了,最近一直在大院干活儿,好不容易抽出时间,赶紧来学习学习。 官方文档, mcp广场可以…...
2025华东杯A/B/C题解题思路+可运行代码参考
A题:跳台滑雪问题 选题分析: 跳台滑雪问题涉及物理学、运动学和优化算法。需要建立数学模型来分析运动员在不同阶段的最佳姿势和策略,以提高运动成绩。问题分为三个小问,分别是助滑坡姿势、空中飞行控制和着陆策略。 解题思路: 1. 助滑坡姿势: 分析助滑坡的物理特性,…...
IsaacLab最新2025教程(7)-创建Interactive Scene
在isaaclab中创建的强化学习训练环境有两种:direct workflow,风格与isaacgym一样。另外一种是manager-based workflow更加模块化,它主要是两部分包括仿真环境也就是即将介绍的interactive scene,与mdp的内容,比如奖励函…...
Linux远程管理
1.网络管理获取计算机的网络信息基本语法:windows ipconfig<img src"ReadMe.assets/image-20250318152355476.png" alt"image-20250318152355476" style"zoom:33%;" />powershell ifconfig 也可以通过上面的网络处获取powershe…...
双指针(4)——盛水最多的容器
题目: 这题可以暴力枚举,但会超时,所以我们要用其他方法。 我们就用示例1的数组为例,我们先取出一部分研究。 虽然我们不能用暴力枚举,但可以借用其思想。 对于6和4组成的容器,它可以储存24个单位的水。…...
sd webui 安装插件sd-webui-EasyPhoto依赖安装失败解决办法
在最新版的SD webui中,可以安装easyphoto插件,官方建议通过github安装,对无法科学上网的用户很不友好。对我自己来说是通过地址: https://gitee.com/wowai/sd-webui-EasyPhoto.git 分支:anyid 点击安装即可。 在安装…...
虚拟机对前端开发的实用价值:提升效率与解决痛点的完整指南
作为前端开发者,虚拟机可能不是你日常工作的核心工具,但它确实能在多个方面为前端开发提供强大支持。下面我将详细解析虚拟机如何帮助前端开发者提升工作效率、解决开发难题。 一、跨浏览器/跨平台测试环境搭建 1.1 多浏览器测试 真实IE测试ÿ…...
用Playwright自动化网页测试,不只是“点点点”
如果你接触过网页自动化测试,可能听说过 Selenium、Puppeteer 这些工具。但最近几年,一个新的开源项目在测试圈子里悄然兴起——它就是 Playwright 。 Playwright 是微软开发的一个自动化库,支持多种浏览器(包括 Chrome、Firefox…...
合并两个有序数组
题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并…...
系统思考:局部最优与全局失衡
最近遇到一家创业公司的创始人,在复盘时说了一句扎心的话:“我们真的已经很努力了,大家每天都在拼,连周末都不休息……但事还是做不完,进展还是很慢。” 我和几个关键岗位员工聊了聊,他们也说:“…...
Windows 系统中安装 flash - attn
#工作记录 一、下载 flash_attn 在 Windows 系统中,直接使用 pip 在线安装 flash_attn 很可能失败。 建议从 kingbri1/flash-attention 的 GitHub 发布页面 下载与当前 Python、torch 和 CUDA 版本匹配的 .whl 文件,并从本地进行安装。 Linux版本&am…...
理想药用植物的特征综述-理想中药材”的系统定义-文献精读125
Decoding and designing: Promising routes to tailor-made herbs 解码与设计:定制化草药的潜力路径 摘要 理想药用植物的特征可归纳为高次生代谢产物含量、高抗逆性、理想的形态以及高产量。本研究提出了两种策略,用于解析中药活性成分的生物合成与质…...
Cline原理分析-prompt
Cline 抓包-prompt原文 You are Cline, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. TOOL USE You have access to a set of tools that are executed upon the user’s…...
allegro 怎样显示/隐藏铜皮shape?
1、setup–>User preferences; 2、Display -->shape_fill ; 3、5个方框打“√”代表隐藏铜皮; 4、不打√代表显示铜皮;...
URP - 公告牌的效果实现
效果: 【太妃糖耶】我的最新作品,快来一睹为快! 原理:使面片的正面永远跟随摄像机的旋转 首先我们可以了解一下顶点旋转的原理 B点是由原坐标系中的基向量和A点坐标值相乘得到的 当旋转此基向量后,B点的坐标值会发生…...
在VTK中使用VTKCamera
文章目录 概要Cpp代码概要 在VTK(Visualization Toolkit)中,vtkCamera 类用于控制三维场景中相机的视角。相机决定了你从哪个角度和位置观察三维场景。使用 vtkCamera 的一般步骤包括创建相机对象、配置相机参数、将相机设置为渲染器的活动相机,以及更新相机视图。 Cpp代…...
牛客:AB4 逆波兰表达式求值
链接:逆波兰表达式求值_牛客题霸_牛客网 题解: 利用栈,遍历字符串数组,遇到运算数则入栈,遇到运算符则取出栈顶两个运算数进行运算,并将运算结果入栈。 class Solution { public:/*** 代码中的类名、方法…...
Linux:文件操作
在C语言中,我们可以使用fopen() fclose() fread() fwrite()等接口进行文件操作,而由于文件是储存于磁盘中的,且磁盘是由操作系统来管理的,因此在用户层面对文件的操作必然要调用操作系统对文件的操作。 我们接下来就要了解操作系…...
Gin 集成 prometheus 客户端实现注册和暴露指标
在 Gin 框架中集成 Prometheus 监控系统,可以帮助开发者实时收集和展示应用程序的性能指标,便于监控和故障排查。 Prometheus 是一个开源的监控和告警系统,最初由 SoundCloud 开发,现已成为 Cloud Native Computing Foundation (…...