从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的各种元信息,如类名、作用域、构造函数参数等。
为了获取某个特定BeanBeanDefinition,可以按照以下步骤进行:

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方法,可以通过以下方式:

  1. 调试模式
    在IDE中设置断点并在调用getBean()或访问BeanDefinition时进入调试模式,通过查看堆栈跟踪可以找到Bean的创建源头。
  2. 自定义扩展
    实现BeanFactoryPostProcessor接口,并重写postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法,在此方法中遍历注册表(registry),针对每个BeanDefinition记录其相关信息。
  3. 结合代码审查与日志输出
    结合源代码审查以及在创建Bean的过程中增加日志输出,以确定Bean的实际来源。

总之,在Spring Boot环境中,虽然直接从BeanDefinition获取@Bean注解的来源较为困难,但我们可以通过上述方法间接地理解和追溯Bean的创建过程。对于大部分应用场景来说,理解和操作Bean定义的元数据就已经足够满足需求了

示例结果

相关视频

黑马程序员Spring视频教程,深度讲解spring5底层原理 - 143集


教程结束!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源世界的学术问题

自由软件基金会是1983年成立的,到现在是41年。正好很有意思的是,在去年还有一篇文章(CSDN 的翻译),专门在质疑说成立 40 年的自由软件基金会是不是已经快不行了,所以我们会用这个标题叫做兴衰发展历程来介绍…

2024!深入了解 大语言模型(LLM)微调方法(总结)

来源: AINLPer公众号(每日干货分享!!) 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 引言 众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起…

[vue2] 使用provide和inject时,无法获取到实时更新的数据

一、场景 当vue文件中存在多级的父子组件传值(即:祖先向下传递数据)、多个子组件或孙子级组件都要使用顶级或父级的数据时,使用provide 和 inject 组合无疑是很方便的一种做法了,但如此只是注入的初始值,并…

如何使用便签快速分类工作待办事项

在日常工作和生活中,我们经常需要处理各种各样的待办事项。而有效地分类这些任务,可以帮助我们更好地管理时间和提高工作效率。使用便签是一种简单而实用的方法,下面将介绍如何利用好用便签来快速分类工作待办事项。 首先,你可以…

【前端入门】设计模式+单多页+React

设计模式是一种解决特定问题的经验总结,它提供了经过验证的解决方案,可以在软件开发过程中使用。设计模式可以帮助前端开发人员更有效地组织和管理代码,并提供一种共享的语言和框架,以便与其他开发人员进行交流。 以下是一些常见…

航海雷达练习软件SPx Radar Trainer

产品简介 航海雷达练习软件SPx Radar Trainer是一款基于计算机的模拟训练软件,为小型船舶、初步接触航海操作的学员提供了虚拟练习环境,让学员可以在计算机上熟悉雷达视频图像与实际船舶运行环境的结合、以便于更好的驾驶船舶避撞。 产品特色 【模拟小…

python脚本实现全景站点矩阵转欧拉角

效果 脚本 import re import numpy as np import math import csv from settings import * # 以下是一个示例代码,可以输入3*3旋转矩阵,然后输出旋转角度:# ,输入3*3旋转矩阵# 计算x,y,z旋转角def rotation_matrix_to_euler_angles(R):

c++异常机制(1) -- 什么是异常机制

情况一: 之前&#xff0c;我们提到了防御性编程&#xff0c;就是说我们预判一些可能出现的问题&#xff0c;然后进行相应的处理。 但是&#xff0c;这些处理往往是在函数中进行的。 比如&#xff0c;判断数组下标是否合法。 -》 if(下标 < 0){ 相应的处理 }; 如上&…

Python中常用的热门库Pygame介绍

Pygame是一个跨平台的Python模块和库&#xff0c;用于创建视频游戏&#xff0c;如独立游戏和多媒体应用。它提供了一组用于制作游戏的常用功能&#xff0c;包括图形、声音、碰撞检测等。Pygame是基于SDL&#xff08;Simple DirectMedia Layer&#xff09;库的&#xff0c;SDL是…

2024年要大干一场!桌面备忘录哪个好?桌面记事本便签软件哪里下载?

当谈到桌面备忘录哪个好的时候&#xff0c;我们常常会陷入选择困难之中。在这个信息爆炸的时代&#xff0c;我们需要一个高效、便捷、易用的工具来帮助我们记录重要事项&#xff0c;提醒日程安排&#xff0c;让我们可以在2024年当中大干一场。而在众多桌面备忘录软件中&#xf…

折叠面板展开动画

<template><div><div class"p_open" click"handleOpen">{{showMore ? 收起筛选 : 展开筛选}}</div><el-collapse-transition><div class"item" v-show"showMore"><div>[Vue warn]: Error …

Asymmetric Directional Coupler(非对称型定向耦合器)

Asymmetric Directional Coupler 正文示例1------直波导耦合部分尺寸不一致示例2------直波导耦合部分材料有区别 正文 在 Directional coupler and Synchronous optical coupling&#xff08;定向耦合器和同步光耦合&#xff09; 和 Symmetric Directional Coupler and trans…