# 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初始化后执行的逻辑}
}

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

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

相关文章

数组的应用-24点游戏

目录 24点游戏 游戏规则 游戏主要分为三部分 电脑出牌 用户输入算式 电脑判断胜负 总结 24点游戏 游戏规则&#xff1a; 54张扑克抽出大小王&#xff0c;剩余52张用来用于游戏&#xff1b;每一轮从52张牌中随机抽出4张&#xff1b;玩家运用加&#xff0c;减&#xff0…

JUC常见类

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java锁的策略&#x1f649; &#x1f439;今日诗词:苟利国家生死以,岂因祸福避趋之&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64…

Windows系统WDS+MDT网络启动自动化安装

Windows系统WDS+MDT网络启动自动化安装 适用于在Windows系统上WDS+MDT网络启动自动化安装 1. 安装准备 1.下载windows server 2019、windows 10 pro的ISO文件,并安装好windows server 2019 2.下载windows 10 2004版ADK及镜像包 1.1 安装平台 Windows 111.2. 软件信息 软件…

模型优化——模型剪枝、模型量化、知识蒸馏

1.模型剪枝 1.1什么是模型剪枝&#xff1f; 深度学习网络模型从卷积层到全连接层存在着大量冗余的参数&#xff0c;大量神经元激活值趋近于0&#xff0c;将这些神经元去除后可以表现出同样的模型表达能力&#xff0c;这种情况被称为过参数化&#xff0c;而对应的技术则被称为模…

摸鱼大数据——select查询7-10

7、union联合查询 union: 对重复数据会去重 union all: 对重复数据不会去重 ​ 注意&#xff1a;union和union all中两边的字段&#xff08;类型、顺序&#xff09;要对应上 示例: use day08; select * from students; ​ select id,name from students where id in (95001,9…

C++面试题其二

19. STL中unordered_map和map的区别 unordered_map 和 map 都是C标准库中的关联容器&#xff0c;但它们在实现和性能方面有显著区别&#xff1a; 底层实现&#xff1a;map 是基于红黑树实现的有序关联容器&#xff0c;而 unordered_map 是基于哈希表实现的无序关联容器。元素…

make xxxx_defconfig 分析

文章目录 执行依赖scripts_basic执行依赖outputmakefile实现%config make rpi_3_32b_defconfig V1&#xff1a; make -f ./scripts/Makefile.build objscripts/basiccc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -stdgnu11 …

opencv视频抽帧保存图片

opencv视频抽帧保存图片video2pic 文章目录 opencv视频抽帧保存图片video2picopencv视频按帧率抽帧opencv视频按帧数抽帧 opencv视频按帧率抽帧 import cv2 import os video_pathC:/Users/Desktop/video/1.mp4 nameos.path.basename(video_path).split(".")[0] outp…

Vue3实战笔记(54)—揭秘Vue3实战:1分钟学会mitt,轻松玩转跨组件通讯

文章目录 前言一、自定义的 useMitt二、在组件中使用 useMitt&#xff1a;三、确保 useMitt 的单例性总结 前言 在 Vue3 中&#xff0c;由于官方移除了on\off 和 $once 实例方法&#xff0c;导致原先基于 Vue2 的事件总线&#xff08;EventBus&#xff09;模式不再适用。因此&…

【QT】qcombox的信号使用小细节,activated(int)和currentIndexChanged(int)

activated(int)和currentIndexChanged(int)这两个信号在QComboBox中都有传递当前索引的功能&#xff0c;但它们触发的条件有所不同&#xff0c;导致它们适用于不同的场景。以下是它们之间的主要区别&#xff1a; 1. activated(int) 触发条件&#xff1a;当用户主动选择了一个…

Python中的 Lambda 函数

大家好&#xff0c;在 Python 编程的世界里&#xff0c;有一种功能强大却不常被提及的工具&#xff0c;它就是 Lambda 函数。这种匿名函数在 Python 中拥有着令人惊叹的灵活性和简洁性&#xff0c;却常常被许多开发者忽视或者只是将其当作一种附加功能。Lambda 函数的引入&…

Java18+ springboot+mysql +Thymeleaf 技术架构开发的全套同城服务家政上门系统源码(APP用户端+APP服务端+PC管理端)

Java springbootmysql Thymeleaf 技术架构开发的全套同城服务家政上门系统源码&#xff08;APP用户端APP服务端PC管理端&#xff09; 家政上门预约系统&#xff1a;该系统综合运用springboot、java1.8、vue移动支付、微信授权登录等技术&#xff0c;由用户小程序、站长小程序、…

C#面:.Net中会存在内存泄漏吗,请简单描述

在C# .NET中&#xff0c;内存泄漏是可能存在的。内存泄漏指的是在程序运行过程中&#xff0c;分配的内存空间没有被正确释放&#xff0c;导致这些内存空间无法再被其他部分使用&#xff0c;从而造成内存的浪费。 在C# .NET中&#xff0c;垃圾回收器&#xff08;Garbage Collec…

亚马逊云科技峰会盛大举行 | 光环新网携光环云数据以高性能智算服务助力企业创新发展

2024年5月29日&#xff0c;云计算行业的年度盛典”2024亚马逊云科技中国峰会”在上海世博中心再次盛大启幕。作为全球领先的云计算服务提供商&#xff0c;亚马逊云科技峰会聚焦前沿科技&#xff0c;与来自不同行业、不同科技领域的优秀企业和用户共同探索AI时代的云端创新发展。…

QProcess类实现将子进程的窗口嵌入的主进程中

在主进程中创建子进程,子进程也是通过qt新建的qwidget窗口的应用程序. bool CncOpWindows::LoadVisionMeasureApp() {QString cmd QCoreApplication::applicationDirPath();int iCamAppType 0;switch (iCamAppType){case 0:cmd "/ImageGrab.exe";//子程序执行文件地…

Java知识大纲

一、基础 (一) Java的应用范围和相关组件 (二)搭建开发环境 (三)类文件定义 (四)编写第一个程序 (五)编译和运行 (六)变量定义和使用 (七)字符串的定义和使用 (八)变量类型转换 (九)静态变量 (十)基本运算、逻辑运算、位运算 (十一)流程结构(条件&#xff0c;循环&a…

华为官网的自助申诉

代码&#xff1a;如下 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> …

MatLab命令行常用命令记录

文章目录 MatLab常用命令行MatLab常用按键标点说明 MatLab常用命令行 Matlab常用命令用来管理目录、命令、函数、变量、工作区、文件及窗口。常用命令如下表 命令作用cd显示或改变当前文件夹load加载指定文件的变量dir显示当前文件夹或指定目录下的文件diary日志文件命令type…

Facebook会话过期是什么情况?如何解决?

如果你点开这篇文章&#xff0c;可能你曾经遇到过Facebook会话过期的错误。无论你是在抓取Facebook数据还是只是浏览动态&#xff0c;看到这个错误消息都会让人很不爽。但别担心&#xff0c;我们将会分享解决Facebook会话过期错误的最佳方法&#xff0c;这样你就可以迅速修复问…

TemuTHunt使用简单介绍

数据列表 详情 列表及详情 数据监控 ------------------------------------------------华丽的分割线------------------------------------ 数据列表 商品详情 更多功能及分析报表 是不是很好用。