当前位置: 首页 > news >正文

# SpringBoot 如何让指定的Bean先加载

SpringBoot 如何让指定的Bean先加载

文章目录

  • SpringBoot 如何让指定的Bean先加载
    • `ApplicationContextInitializer`
      • 使用
        • 启动入口出注册
        • 配置文件中配置
        • spring.factories中配置
    • `BeanDefinitionRegistryPostProcessor`
      • 使用
    • 使用@DependsOn注解
    • 实现SmartInitializingSingleton接口
    • 使用@PostConstruct注解

SpringBoot 中如何让自己的某个指定的 Bean 在其他 Bean 前完成被 Spring 加载

ApplicationContextInitializer

  • 用于在spring容器刷新之前初始化Spring ConfigurableApplicationContext的回调接口。(在容器刷新之前调用该类的 initialize 方法。并将 ConfigurableApplicationContext 类的实例传递给该方法)
  • 通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。
  • 通过实现ApplicationContextInitializer接口,开发人员可以编程方式对应用程序上下文进行自定义配置。
  • 这在需要动态设置属性、注册Bean定义或执行其他初始化逻辑时非常有用。
public class CustomApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();// 注册自定义Bean定义// applicationContext.registerBean("customBean", CustomBean.class);System.out.println("Custom initialization logic executed");}
}
  • CustomApplicationContextInitializer实现了ApplicationContextInitializer接口,并覆盖了initialize方法。
  • initialize方法中,我们可以获取应用程序上下文的环境对象,并进行自定义配置,如设置属性或注册Bean定义。

使用

启动入口出注册
  • 要在Spring Boot应用程序中使用ApplicationContextInitializer,可以将其注册为Spring Boot应用程序的一部分。例如,在Spring Boot应用程序的main方法中,可以使用SpringApplication类的addInitializers方法将自定义的ApplicationContextInitializer添加到应用程序中:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(MySpringBootApplication.class);application.addInitializers(new CustomApplicationContextInitializer());application.run(args);}
}
配置文件中配置
context.initializer.classes=com.li.springbootproject.spring.other.CustomApplicationContextInitializer 
spring.factories中配置
  • SpringBootSPI扩展---META-INF/spring.factories中配置
org.springframework.context.ApplicationContextInitializer=com.li.springbootproject.spring.other.CustomApplicationContextInitializer 

BeanDefinitionRegistryPostProcessor

  • BeanDefinitionRegistryPostProcessorSpring Boot 中的一个接口,它允许您在应用程序上下文刷新之前修改 bean 定义。这对于注册额外的 bean、修改现有 bean 定义或执行其他自定义操作很有用。

使用

  • 创建一个实现 BeanDefinitionRegistryPostProcessor 接口的类。
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {// 在这里添加您的自定义逻辑,例如注册新的 bean 或修改现有的 bean 定义BeanDefinition beanDefinition = new RootBeanDefinition(MyCustomBean.class);registry.registerBeanDefinition("myCustomBean", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 通常不需要在此方法中执行任何操作}
}
  • 创建了一个名为 MyBeanDefinitionRegistryPostProcessor 的类,它实现了 BeanDefinitionRegistryPostProcessor 接口。在 postProcessBeanDefinitionRegistry 方法中,我们注册了一个名为 myCustomBean 的新 bean,它是 MyCustomBean 类的实例。

  • @Configuration 注解添加到您的 BeanDefinitionRegistryPostProcessor 实现类上。这将告诉 Spring Boot 在应用程序上下文初始化期间自动检测和应用该类。

  • 运行Spring Boot 应用程序。一旦应用程序上下文初始化,就会自动调用 postProcessBeanDefinitionRegistry 方法,从而允许修改 bean 定义。

请注意,在使用 BeanDefinitionRegistryPostProcessor 时要小心,因为它可能会影响应用程序的其他部分。在修改 bean 定义时,请确保您了解自己在做什么,并且知道潜在的副作用。

使用@DependsOn注解

  • @DependsOn 注解可以用在一个 Bean 上,指定它依赖于另一个 Bean。这样一来,Spring Boot 在初始化该 Bean 时,会先初始化它所依赖的 Bean
@Component
public class MyBean1 {// ...
}@Component
@DependsOn("myBean1")
public class MyBean2 {// ...
}

实现SmartInitializingSingleton接口

  • SmartInitializingSingleton接口在所有单例Bean都实例化之后调用,可以在该接口的afterSingletonsInstantiated方法中执行一些特定的操作。可以实现该接口并在方法中指定需要先加载的Bean的初始化逻辑。
@Component
public class MyBean implements SmartInitializingSingleton {@Overridepublic void afterSingletonsInstantiated() {// 在所有单例Bean实例化之后执行初始化逻辑}
}

使用@PostConstruct注解

  • @PostConstruct注解用于指定在Bean初始化之后立即执行的方法。您可以在需要先加载的Bean的初始化方法上使用@PostConstruct注解。
@Component
public class MyBean {@PostConstructpublic void init() {// 在Bean初始化后执行的逻辑}
}
Construct`注解。```java
@Component
public class MyBean {@PostConstructpublic void init() {// 在Bean初始化后执行的逻辑}
}

相关文章:

# SpringBoot 如何让指定的Bean先加载

SpringBoot 如何让指定的Bean先加载 文章目录 SpringBoot 如何让指定的Bean先加载ApplicationContextInitializer使用启动入口出注册配置文件中配置spring.factories中配置 BeanDefinitionRegistryPostProcessor使用 使用DependsOn注解实现SmartInitializingSingleton接口使用P…...

家用洗地机哪个品牌好?洗地机怎么选?这几款全网好评如潮

如今&#xff0c;人们家里越来越多的智能清洁家电&#xff0c;小到吸尘器、电动拖把&#xff0c;大到扫地机器人、洗地机&#xff0c;作为一个用过所有这些清洁工具的家庭主妇&#xff0c;我觉得最好用的还是洗地机。它的清洁效果比扫地机器人更好&#xff0c;功能也比吸尘器更…...

iOS与前端:深入解析两者之间的区别与联系

iOS与前端&#xff1a;深入解析两者之间的区别与联系 在数字科技高速发展的今天&#xff0c;iOS与前端技术作为两大热门领域&#xff0c;各自在移动应用与网页开发中扮演着不可或缺的角色。然而&#xff0c;这两者之间究竟存在哪些差异与联系呢&#xff1f;本文将从四个方面、…...

SpringBoot 基于jedis实现Codis高可用访问

codis与redis的关系 codis与redis之间关系就是codis是基于多个redis实例做了一层路由层来进行数据的路由&#xff0c;每个redis实例承担一定的数据分片。 codis作为开源产品&#xff0c;可以很直观的展示出codis运维成本低&#xff0c;扩容平滑最核心的优势. 其中&#xff0…...

力扣108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 找割点&#xff0c;一步一步将原数组分开。妙极了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; /*** Definition for a binary tree node.* public class TreeNode {* int val;…...

人工智能机器学习系统技术要求

一 术语和定义 1.1机器学习系统 machinelearningsystem 能运行或用于开发机器学习模型、算法和相关应用的软件系统。 1.2机器学习框架 machinelearningframework 利用预先构建和优化好的组件集合定义模型,实现对机器学习算法封装、数据调用处理和计算资源使用的软件库。 1…...

学习整理使用JavaScript中如何判断变量是否存在的四种常用方法

学习整理使用JavaScript中如何判断变量是否存在的四种常用方法 前言1. 使用 typeof 运算符判断变量类型2. 使用全局对象 window 或 global 判断变量是否存在3. 使用 in 关键字判断变量是否存在4. 使用 try…catch 块判断变量是否存在5. 综合示例总结 前言 在 JavaScript 中&am…...

docker实现jenkins+git+naocas一体化自动部署

一、jenkins安装 1.1 docker 安装jenkins docker pull jenkins/jenkins 1.2 docker 启动jenkins docker run --name myjenkins -d -p 8081:8080 -p 8085:8085 jenkins/jenkins –name 指定容器名称为myjenkins -d 表示后台运行 -p 8081&#xff1a;8080 表示Docker Host(运行Do…...

Flutter 中的 PerformanceOverlay 小部件:全面指南

Flutter 中的 PerformanceOverlay 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的应用。在 Flutter 的开发过程中&#xff0c;性能监控是一个重要的方面。PerformanceOverlay 是 Flutter…...

es的总结

es的collapse es的collapse只能针对一个字段聚合&#xff08;针对大数据量去重&#xff09;&#xff0c;如果以age为聚合字段&#xff0c;则会展示第一条数据&#xff0c;如果需要展示多个字段&#xff0c;需要创建新的字段&#xff0c;如下 POST testleh/_update_by_query {…...

React常见的一些坑

文章目录 两个基础知识1. react的更新问题, react更新会重新执行react函数组件方法本身,并且子组件也会一起更新2. useCallback和useMemo滥用useCallback和useMemo要解决什么3. react的state有个经典的闭包,导致拿不到最新数据的问题.常见于useEffect, useMemo, useCallback4. …...

Java基础29(编码算法 哈希算法 MD5 SHA—1 HMac 算法 堆成加密算法)

目录 一、编码算法 1. 常见编码 2. URL编码 3. Base64编码 4. 小结 二、哈希算法 1. 哈希碰撞 2. 常用哈希算法 MD5算法 SHA-1算法 自定义HashTools工具类 3. 哈希算法的用途 校验下载文件 存储用户密码 4. 小结 三、Hmac算法 小结&#xff1a; 四、对称加密…...

人脸识别——OpenCV

人脸识别 创建窗口创建按钮设置字体定义标签用于显示图片选择并显示图片检测图片中的人脸退出程序返回主界面 创建窗口 导入tkinter库&#xff0c;创建窗口&#xff0c;设置窗口标题和窗口大小。 import tkinter as tkwin tk.Tk() win.title("人脸识别") win.geom…...

深入探索容器:什么是容器及其在现代软件开发中的作用

深入探索容器&#xff1a;什么是容器及其在现代软件开发中的作用 引言 在今天的软件开发和运维领域&#xff0c;容器技术已经成为了一个不可或缺的工具。从初创企业到大型企业&#xff0c;从Web应用到微服务架构&#xff0c;容器都在发挥着其独特的作用。那么&#xff0c;什么…...

STM32-- GPIO->EXTI->NVIC中断

一、NVIC简介 什么是 NVIC &#xff1f; NVIC 即嵌套向量中断控制器&#xff0c;全称 Nested vectored interrupt controller 。它 是内核的器件&#xff0c;所以它的更多描述可以看内核有关的资料。M3/M4/M7 内核都是支持 256 个中断&#xff0c;其中包含了 16 个系统中…...

【介绍下WebStorm开发插件】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

推荐丨一键申请SSL证书,让网站实现HTTPS访问!

申请HTTPS证书可以简化为以下几个直接步骤&#xff0c;以便您能快速理解和操作&#xff1a; 1. 确定证书类型&#xff1a; - 单域名证书&#xff1a;适用于一个特定域名。 - 通配符证书&#xff1a;适用于同一主域名下的所有子域名。 - 多域名证书&#xff1a;覆盖多个不同的域…...

交叉导轨在医疗设备上的作用!

随着医疗器械行业的需求逐步增长&#xff0c;交叉导轨给医疗器械行业带来了广阔的发展前景。作为重要的精密传动元件&#xff0c;交叉导轨具有寿命长、高精度、高刚性、高耐腐蚀性和高稳定性等优点&#xff0c;满足精密仪器上对产品的高要求使用场景。 在医疗设备领域中交叉导轨…...

【云原生】Docker Compose 使用详解

目录 一、前言 二、Docker Compose 介绍 2.1 Docker Compose概述 2.2 Docker Compose特点 2.3 Docker Compose使用场景 三、Docker Compose 搭建 3.1 安装docker环境 3.2 Docker Compose安装方式一 3.2.1 下载最新版/如果不是最新可替换最新版本 3.2.2 设置权限 3.2.…...

通过LabVIEW提升生产设备自动化水平

现代制造业对生产设备的自动化水平提出了越来越高的要求。使用LabVIEW这一强大的图形化编程环境&#xff0c;可以显著提升生产设备的自动化程度&#xff0c;改善生产效率和产品质量。本文将详细分析如何通过LabVIEW改善生产设备的自动化水平&#xff0c;并提供具体的实施策略与…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...

无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技

无需布线的革命&#xff1a;电力载波技术赋能楼宇自控系统 在楼宇自动化领域&#xff0c;传统控制系统依赖复杂的专用通信线路&#xff0c;不仅施工成本高昂&#xff0c;后期维护和扩展也极为不便。电力载波技术&#xff08;PLC&#xff09;的突破性应用&#xff0c;彻底改变了…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...