从Spring Boot应用上下文获取Bean定义及理解其来源
前言
在Spring框架中,Bean是组成应用程序的核心单元。特别是在Spring Boot项目中,通过使用SpringApplication.run()方法启动应用后,我们可以获得一个ConfigurableApplicationContext实例,这个实例代表了整个应用程序的运行时环境,其中包含了所有由Spring管理的Bean。

启动Spring Boot应用并获取上下文
首先,让我们看一下如何启动一个Spring Boot应用并获取其上下文:
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {// 获取Spring上下文ConfigurableApplicationContext context = SpringApplication.run(PageHelperApplication.class, args);// 在此处对上下文进行操作,例如获取BeanDefinition}
}
访问和操作BeanDefinition
在获取到ConfigurableApplicationContext实例之后,我们可以进一步探索其内部管理的Bean定义。每个Bean在被Spring容器创建前都会有一个对应的BeanDefinition对象,它包含了Bean的各种元信息,如类名、作用域、构造函数参数等。
为了获取某个特定Bean的BeanDefinition,可以按照以下步骤进行:
import org.springframework.beans.factory.support.DefaultListableBeanFactory;// ...public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(PageHelperApplication.class, args);String beanName = "yourBeanName"; // 替换为你要查询的Bean的名字// 获取BeanFactoryDefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();// 通过BeanFactory获取BeanDefinitionBeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);// 现在你可以查看或操作beanDefinition中的属性// 注意:BeanDefinition通常不会直接提供关于@Bean注解所在的类和方法名的信息
}
这里给一段示例代码:
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {// 获取Spring上下文ConfigurableApplicationContext context = SpringApplication.run(PageHelperApplication.class, args);// 获取BeanFactoryDefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();// 遍历所有Bean定义for (String name : context.getBeanDefinitionNames()) {// 获取Bean定义的资源描述String source = beanFactory.getBeanDefinition(name).getResourceDescription();if (source != null) {System.out.println(name + " 来源:" + source);}}}
}
关于@Bean注解来源的追踪
尽管BeanDefinition本身并不直接包含@Bean注解所在的具体类和方法名信息,但要了解某个Bean来源于哪个配置类及其@Bean方法,可以通过以下方式:
- 调试模式:
在IDE中设置断点并在调用getBean()或访问BeanDefinition时进入调试模式,通过查看堆栈跟踪可以找到Bean的创建源头。 - 自定义扩展:
实现BeanFactoryPostProcessor接口,并重写postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法,在此方法中遍历注册表(registry),针对每个BeanDefinition记录其相关信息。 - 结合代码审查与日志输出:
结合源代码审查以及在创建Bean的过程中增加日志输出,以确定Bean的实际来源。
总之,在Spring Boot环境中,虽然直接从BeanDefinition获取@Bean注解的来源较为困难,但我们可以通过上述方法间接地理解和追溯Bean的创建过程。对于大部分应用场景来说,理解和操作Bean定义的元数据就已经足够满足需求了
示例结果

相关视频
黑马程序员Spring视频教程,深度讲解spring5底层原理 - 143集
教程结束!
相关文章:
从Spring Boot应用上下文获取Bean定义及理解其来源
前言 在Spring框架中,Bean是组成应用程序的核心单元。特别是在Spring Boot项目中,通过使用SpringApplication.run()方法启动应用后,我们可以获得一个ConfigurableApplicationContext实例,这个实例代表了整个应用程序的运行时环境…...
如何处理网络攻击对系统造成的损害?
网络攻击对系统造成的损害是当今企业面临的一大挑战。随着互联网的普及和数字化转型的加速,企业的运营越来越依赖于网络,但同时也面临着越来越多的网络安全威胁。一旦企业遭受网络攻击,其系统可能会遭受不同程度的损害,导致数据泄…...
数字IC后端设计利器 - 《Innovus的基本使用流程和命令》(附下载)
Innovus作为数字后端工具的后起之秀,在先进工艺下已经取得了令人瞩目的成就。其在Run time上的优势令人刮目,在timing、DRC、IR-drop上的结果更是让人竖起大拇指。 数字IC后端工程师学习Cadence公司的Innovus工具非常重要,因为Innovus是一款…...
Blender中四种不同的几何体类型(网格、曲线、体积和实例 )
网格、曲线、体积和实例是Blender中四种不同的几何体类型。它们各有特点,适用于不同的建模场景。 网格是由顶点、边和面组成的三维对象。它是Blender中最常用的几何体类型,可以用来创建各种模型,例如角色、场景、道具等。 曲线是一维对象&a…...
Vue3 学习笔记(Day5)
「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. Vue3 学习笔记(Day1) 2. Vue3 学习笔记(Day2&…...
【网络编程】实现服务器端和客户端的通讯的简单程序
套接字是什么? 服务端接受连接请求的套接字创建过程可分为以下4步: 1、调用socket创建套接字 2、调用bind函数分配IP地址和端口号 3、调用listen函数转换为可接受请求状态 4、调用accept函数受理连接请求 1、调用socket创建套接字 serv_sock soc…...
如何在Portainer中部署Nginx容器并制作一个本地站点结合cpolar发布至公网可访问
文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…...
Mysql的储存引擎
储存引擎介绍 1. 文件系统 操作系统存取数据的一种机制 2. 文件系统类型 不管使用什么文件系统,数据内容不会变化 不同的是,存储空间、大小、速度 3. MySQL存储引擎 可以理解为,MySQL的“文件系统”,只不过功能更加强大 4. MySQL…...
【查漏补缺你的Vue基础】Vue数据监听深度解析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
大语言模型LLM发展历程中的里程碑项目:国内外技术革新重塑自然语言处理(LLM系列02)
文章目录 标题:大语言模型LLM发展历程中的里程碑项目:国内外技术革新重塑自然语言处理(LLM系列02) 引言早期奠基阶段Transformer架构引领变革GPT系列的重大进展国内外标志性LLM项目LLM在中国的应用实践LLM研究面临的挑战与应对策略…...
JS二进制文件转换:File、Blob、Base64、ArrayBuffer
类型转换 1. Blob、File → Base64 function fileToDataURL(file) {let reader new FileReader();reader.readAsDataURL(file);reader.onload function (e) {return reader.result;}; }2. Base64 → Blob、File // Base64 转为 Blob function dataURLToBlob(fileDataURL) …...
编译opencv gpu版的条件
一、具备以下条件即可编译opencv gpu: 1、 终端设备必须有独立显卡。cmd窗口:nvidia-smi查看显卡信息 2、下载并安装CUDA Toolkit(根据显卡下载对应的CUDA Toolkit软件)、cuDNN(根据CUDA版本下载对应的cuDNN࿰…...
List集合的Stream流式操作实现数据类型转换
问题现象: 最近在项目中,有一些逻辑想用List集合的Stream流式操作来快速实现,但由于之前没做好学习笔记和总结,导致一时间想不起来,只能用本方法来解决,如下: 可以看出来代码量是比较冗长的&…...
Ubuntu 20.04.6 LTS下edge浏览器点击图标没反应
1.网上的解决方案 解决Ubuntu系统下启动root账户后Linux版本edge浏览器无法启动等 2.采用的解决方案 之前我一直是在官网下载 Microsoft Edge下载,安装,卸载,重装的stable版本,然后安装,始终没有效果。 最后利用Linux…...
php基础学习之错误处理(其一)
一,错误处理的概念 错误处理指的是系统(或者用户)在执行某些代码的时候,发现有错误,就会通过错误处理的形式告知程序员,俗称报错 二,错误分类 语法错误:书写的代码不符合 PHP 的语法规范,语法错…...
Nginx 解析漏洞复现
环境搭建 下载之后上传到虚拟机并解压 进入这个路径 (root?kali)-[~/vulhub-master/nginx/nginx_parsing_vulnerability]就能看到有docker-compose.yml 启动环境 正常显示 增加/.php后缀,被解析成PHP文件: 漏洞原因:开启了cgi.fix_pathin…...
JQMobile Loader Widget 遮罩层改造
最近在用jqmobile 做一个混合APP项目时候用到 jqmobile1.4.3提供的Loader Widget控件,但是这个控件本身是一个loading弹出层,这个弹出层弹出之后,用户还是可以去点击按钮,重复发送请求,为了防止重复提交,我想了两种办法, 1,在loading弹出层弹出之后,让按钮不可用.但是form表单…...
练习 2 Web [ACTF2020 新生赛]BackupFile 1
[ACTF2020 新生赛]BackupFile 1 Web常规题目 首先尝试查找常见的前端页面index.php之类的,没找到 题目有个“BackupFile”——备份文件 尝试用工具遍历查找相关的文件 御剑没扫出来,搜索搭建好dirsearch后,扫出来的index.php.bak 扫描工…...
【python】subprocess用法示例
当然,下面是一些使用 Python subprocess 模块的示例: 1. 运行命令并捕获输出 import subprocess # 运行 ls 命令并捕获输出 result subprocess.run([ls, -l], stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue) # 获取命令的输出和错误信息 o…...
Socket网络编程(三)——TCP快速入门
目录 概述TCP连接可靠性1. 三次握手过程2. 四次挥手过程3. 为什么挥手需要四次? 传输可靠性TCP核心APITCP传输初始化配置&建立连接客户端创建Socket建立连接服务端创建ServerSocket监听连接ServerSocket 和 Socket的关系 Socket基本数据类型传输客户端数据传输服…...
手把手教你如何在企业网络中部署SyncE(含芯片选型指南)
手把手教你如何在企业网络中部署SyncE(含芯片选型指南) 在数字化转型浪潮中,企业网络对时钟同步精度的要求正从毫秒级向微秒级跃迁。SyncE(同步以太网)技术凭借其媲美传统SDH的同步性能,正在5G前传、金融交…...
欧姆龙CP系列项目级PLC程序模板:即拿即用,地址分配明确,逻辑已验证
欧姆龙PLC程序 欧姆龙CP系列项目级PLC程序模板,拿过来可以直接做项目,逻辑关系很多项目验证过,只需要加进去工艺流程即可,各地址分配明确;有专用的CP系列地址分配表做参考;对欧姆龙PLC学习和提高有很大的帮…...
因子分析实战:从数据清洗到维度命名的完整指南
1. 因子分析入门:为什么我们需要降维? 第一次接触因子分析时,我盯着屏幕上的20个量表题项直发愁。这些密密麻麻的问卷数据就像一屋子杂乱无章的乐高积木,明明知道它们能拼出完整图案,却不知从何下手。这正是因子分析大…...
为什么92%的团队误判AI编码成本?3步穿透LLM幻觉层、Token开销、隐性重构成本(含审计SOP模板)
第一章:智能代码生成与代码成本分析 2026奇点智能技术大会(https://ml-summit.org) 现代软件工程正经历一场由大语言模型驱动的范式迁移:代码不再仅由开发者逐行书写,而是由上下文感知的智能体协同生成、验证与优化。与此同时,“…...
别再用Profiler看AI代码了!奇点大会宣布传统性能分析工具对LLM生成代码失效率高达83.6%
第一章:AI代码性能分析的范式危机与奇点宣告 2026奇点智能技术大会(https://ml-summit.org) 当LLM驱动的自动代码生成在37毫秒内完成CUDA核函数重写,而传统profiler仍卡在符号解析阶段时,性能分析的底层契约已然失效。我们正站在一个认知断…...
Unlock Music:3分钟解锁加密音乐,让付费歌曲真正属于你
Unlock Music:3分钟解锁加密音乐,让付费歌曲真正属于你 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目…...
Android Studio中文界面完整汉化指南:三步实现母语开发环境
Android Studio中文界面完整汉化指南:三步实现母语开发环境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为And…...
从零到一:OpenClaw 数字员工全流程实战指南
从零到一:OpenClaw 数字员工全流程实战指南 OpenClaw(昵称“小龙虾”)是2026年最火的开源AI智能体框架,GitHub星标超28万。它之所以被称为“数字员工”而非“聊天机器人”,核心区别在于:它能真正“动手干活…...
AD9833信号发生器DIY:从原理图绘制到PCB打样,打造你的桌面级测试工具
AD9833信号发生器DIY:从原理图绘制到PCB打样,打造你的桌面级测试工具 在电子实验室里,一台可靠的信号发生器是不可或缺的基础设备。无论是调试射频电路、测试滤波器响应,还是验证传感器性能,都需要精确可控的信号源。商…...
Mermaid Live Editor:在线实时图表编辑的终极免费解决方案
Mermaid Live Editor:在线实时图表编辑的终极免费解决方案 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-ed…...
