使用Spring @DependsOn控制bean加载顺序

2023-05-16

使用Spring @DependsOn控制bean加载顺序

spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范。但spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A被加载。但如果beanA不直接依赖B,我们如何让B仍先加载呢?

控制bean初始化顺序

可能有些场景中,bean A 间接依赖 bean B。如Bean B应该需要更新一些全局缓存,可能通过单例模式实现且没有在spring容器注册,bean A需要使用该缓存;因此,如果bean B没有准备好,bean A无法访问。

另一个场景中,bean A是事件发布者(或JMS发布者),bean B (或一些) 负责监听这些事件,典型的如观察者模式。我们不想B 错过任何事件,那么B需要首先被初始化。

简言之,有很多场景需要bean B应该被先于bean A被初始化,从而避免各种负面影响。我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。下面通过示例来说明。

示例说明

示例通过事件机制说明,发布者和监听者,然后通过spring配置运行。为了方便说明,示例进行了简化。

EventManager.java
事件管理类,维护监听器列表,通过单例方法获取事件管理器,可以增加监听器或发布事件。


import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class EventManager {
    private final List<Consumer<String>> listeners = new ArrayList<>();

    private EventManager() {
    }

    private static class SingletonHolder {
        private static final EventManager INSTANCE = new EventManager();
    }

    public static EventManager getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public void publish(final String message) {
        listeners.forEach(l -> l.accept(message));
    }

    public void addListener(Consumer<String> eventConsumer) {
        listeners.add(eventConsumer);
    }
}

EventPublisherBean.java
事件发布类,通过EventManager类发布事件。

import com.logicbig.example.EventManager;

public class EventPublisherBean {

    public void initialize() {
        System.out.println("EventPublisherBean initializing");
        EventManager.getInstance().publish("event published from EventPublisherBean");
    }
}

EventListenerBean.java
事件监听者,可以增加监听器。

import com.logicbig.example.EventManager;

public class EventListenerBean {

    private void initialize() {
        EventManager.getInstance().
                addListener(s ->
                        System.out.println("event received in EventListenerBean : " + s));
    }
}

AppConfig.java
配置运行类。

@Configuration
@ComponentScan("com.logicbig.example")
public class AppConfig {

    @Bean(initMethod = "initialize")
    @DependsOn("eventListener")
    public EventPublisherBean eventPublisherBean () {
        return new EventPublisherBean();
    }

    @Bean(name = "eventListener", initMethod = "initialize")
    // @Lazy
    public EventListenerBean eventListenerBean () {
        return new EventListenerBean();
    }

    public static void main (String... strings) {
        new AnnotationConfigApplicationContext(AppConfig.class);
    }
}

运行AppConfig的main方法,输出结果为:

EventListenerBean initializing
EventPublisherBean initializing
event received in EventListenerBean : event published from EventPublisherBean

总结

如果我们注释掉@DependsOn("eventListener"),我们可能不确定获得相同结果。尝试多次运行main方法,偶尔我们将看到EventListenerBean 没有收到事件。为什么是偶尔呢?因为容器启动过程中,spring按任意顺序加载bean。

那么当不使用@DependsOn可以让其100%确定吗?可以使用@Lazy注解放在eventListenerBean ()上。因为EventListenerBean在启动阶段不加载,当其他bean需要其时才加载。这次我们仅EventListenerBean被初始化。

EventPublisherBean initializing

现在从新增加@DependsOn,也不删除@Lazy注解,输出结果和第一次一致,虽然我们使用了@Lazy注解,eventListenerBean在启动时仍然被加载,因为@DependsOn表明需要EventListenerBean

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Spring @DependsOn控制bean加载顺序 的相关文章

  • 安装编译tinyply

    1 下载tinyply xff1a https github com ddiakopoulos tinyply 2 修改CmakeLists txt第17行 set SHARED LIB false CACHE BOOL 34 Build
  • crazyswarm下载编译和使用问题整理

    本文写于2021 12 6 最近一次更新为2023 1 5 目录 项目简介 安装步骤 编译报错解决 使用注意 项目简介 crazyswarm版本对应commit为 4d6ca47b085227fbc893479894001d1c7ceab5
  • Word排版过程中多个参考文献一起引用

    最近在写论文的过程中 xff0c 遇到多个参考文献在一起 xff0c 如果手动输入 xff0c 在打印或者转换成pdf的过程中 xff0c 总是只剩下一个文献 如 1 2 3 4 想使用 1 4 来交叉引用 xff1a 1 切换域代码 xf
  • 《成长是一件孤独的事》周国平 书摘

    每个人在世界上都应该有这样一件事情 xff0c 你真正喜欢它 xff0c 做这件事情本身就是享受 xff0c 你没有快乐工作的能力 xff0c 这才是最可悲的 人是带着感情生活 xff0c 有好恶 xff0c 有喜怒哀乐 xff0c 在我看
  • 为什么他们能成为大师-7位华人诺贝尔科学奖得主的成功法则

    7位华人诺贝尔科学奖得主的治学方法有以下特点 xff1a xff08 1 xff09 求知欲强 xff0c 目标很明确 xff08 2 xff09 好问善疑 xff0c 敢于提出问题 xff08 3 xff09 文理兼通 xff0c 艺术修
  • VINS-MONO的运行方法

    在ubuntu16 04上运行vins mono的方法 xff1a 打开三个终端 xff1a 第一个终端输入 xff1a source VINS Mono ws devel setup bash roslaunch vins estimat
  • macbook pro 中安装jupyter notebook 的过程以及遇到的问题

    1 首先打开terminal 使用python命令查看当前python版本为 Python 2 7 10 2 升级pip安装工具 xff1a sudo python m pip install upgrade force pip 注 xff
  • 视觉SLAM十四讲 安装libcxsparse3.1.2报错

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 http blog csdn net qq 29985391 article details 79007693 经常会暗示自己学会动脑思考 xff0c 先自己去想解
  • PX4多旋翼航线算法代码解析

    文章目录 前言一 航线算法二 代码解析1 GPS经纬度转地理系下坐标2 scale值的计算3 位置坐标转换4 飞机当前位置距离目标位置误差小于一个单位15 飞机当前位置距离目标位置误差大于等于一个单位16 新计算出的期望位置归一化到单位圆坐
  • ROS入门(八)——仿真机器人四(Gazebo+Rviz+雷达、摄像头、kinet仿真显示)

    所用的学习链接 xff1a 奥特学园 ROS机器人入门课程 ROS理论与实践 零基础教程P278 288 以上视频笔记见http www autolabor com cn book ROSTutorials 官方参考链接 xff1a htt
  • ROS入门(一)——ROS安装(vmware16+ubuntu20.04+ROS-Noetic)

    嵌套 xff1a ROS可以在Ubuntu上运行 xff0c Ubuntu在虚拟机Vmware中安装 从 虚拟机vmware安装 ubuntu安装 ros安装 xff0c 逐步介绍安装ROS环境的过程 整个过程是我一步步跟着各种博客安装实现
  • [原创]人生感悟

    女人最有力的武器不是尖酸刻薄和斤斤计较 xff0c 而是温柔和宽容大度 世界万物都将求一个平衡 xff0c 所有的善行不一定能有回报 xff0c 但是自己种的果实往往都会自己食用 xff0c 不要在年轻的时候鲁莽地为自己挖坑 xff0c 感
  • win10找不到d3dx9_43.dll,无法正常启动0xc000007b

    Win10电脑 xff0c 安装PhoenixRC时 xff0c 安装好后点击运行 xff0c 报错找不到d3dx9 43 dll 按照网上的一些教程下载d3dx9 43 dll并放到C Windows System32 下再运行regsv
  • 收录一些欧美优秀css网站

    http www dezinerfolio com 漂亮欧美风格博客 http hellomac pl http divplayers com http skipvine ro http www tooopen com 虽然是国产的 xff
  • 几种非易失性存储器的比较

    SRAM为数据访问和存储提供了一个快速且可靠的手段 由系统电源或其他备用电源 xff08 如电池 xff09 供电时 xff0c 他们就具有非易失性 表1给出了几种给定的非易失性存储器存储技术的优缺点 表1非易失性存储器比较 NVSRAM中
  • C#向Excel报表中插入图片的2种方法

    这几天做向Excel插入数据 xff0c 其中有插入图片的需求 xff0c 经试验 xff0c 下面2种方法都可以插入图片 xff0c 但各有不同的用处 现将这2种方法共享出来 xff0c 希望需要的朋友进行参考 xff0c 代码中已经有详
  • Response.Redirect 打开新窗口的两种方法

    一般情况下 xff0c Response Redirect 方法是在服务器端进行转向 xff0c 因此 xff0c 除非使用 Response Write 34 lt script gt window location 61 39 http
  • C# 实现向浏览器的兼容性视图列表中添加、删除网站和检查网站是否在兼容性网站列表中

    今天回答论坛上的一个问题 xff0c 搜索了一下网上 xff0c 并没有找到一个完整的例子 xff0c 下面根据网上的一些资料 xff0c 经过转换 完善成一个完整的例子 下面的例子可以实现添加 删除 检测网站是否在兼容性网站列表中的功能
  • Excel中 ColorIndex 属性值和颜色对照表

    Excel中 ColorIndex 属性值和颜色对照表 资料参考 http msdn microsoft com en us library cc296089 aspx http www mvps org dmcritchie excel
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(一)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 跨域请求 xff0c 顾名思义 xff0c 就是一个站点中的资源去访问另外一个不同域名站点上的

随机推荐

  • AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 2 xff0c 预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTION
  • 将文本文件的内容或者文字保存成图片

    调用方法 xff1a ConvertTextFileToImage Server MapPath 34 Log txt 34 Server MapPath 34 Log png 34 实现代码 xff1a void ConvertTextF
  • 2011年终总结:为了娜娜的微笑

    蒙娜丽莎为什么笑 xff1f 这个问题 xff0c 如果达 芬奇自己都没有交代过 xff0c 那么就没有人知道答案了 xff0c 后来所有的答案都是推测的 xff0c 答案众说纷纭 xff0c 这里就不做评论了 作为计算机运行的代码 xff
  • 安装windows+两个ubuntu(三系统)成功案例

    在已有的win10 43 ubuntu18 04双系统基础上 xff0c 再安装一个ubuntu20 04 原有配置 1T固态硬盘 43 2T机械硬盘 xff1b 固态硬盘上已经安装了win10 xff0c 机械硬盘上一个分区已经安装了ub
  • Windows 文件资源管理器中搜索带特殊字符文件名的方法

    今天处理一些文件 xff0c 文件夹这包含有类似 16年普通高等学校招生全国统一考试 英语 的文件名 xff0c 想全部找出来删除掉 xff0c 直接在文件资源管理器里面输入 是搜索不到想要的文件的 xff0c 这些是特殊字符 xff0c
  • ROS学习记录——Gazebo 里添加自己的物体模型

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言 一 下载3D模型 二 编辑三维模型 1 使用sketch up 2 使用blender编辑 三 将三维模型导入Gazebo 1
  • 【NEUQ RM SI战队项目开源】gazebo仿真开源

    NEUQ RM SI战队项目开源 gazebo仿真开源 写在前面演示视频第一部分 xff1a 机器人仿真环境正文 xff1a 基于gazebo的RM仿真环境贡献照片墙 写在前面 一个新冠疫情 xff0c 打乱了所有队伍的备赛计划 xff0c
  • 嵌入式软件高频面试题

    本文转载自公众号 xff1a 嵌入式Hacker 原文地址 xff1a 职场人生 嵌入式软件高频面试题 一 进程与线程 1 什么是进程 线程 xff0c 有什么区别 xff1f 进程是资源 xff08 CPU 内存等 xff09 分配的基本
  • Ubuntu下硬件信息的查看

    一 相关命令 1 查看cpu信息概要 xff1a lscpu 2 大而全的命令 xff08 查看cpu的信更加全面 xff09 xff1a cat proc cpuinfo 3 查看整个系统的硬件信息 xff1a lshw 如果觉得终端看起
  • 我的2011—前脚踏进了IT行业的一步,大一Java开发学生。

    我写这个犹豫了很久 xff0c 想想在CSDN都是在这条路上走了几年的 xff0c 十几年的 xff0c 我还只是走了半年的一个90后 但是 xff0c 在这半年里 xff0c 我的感触颇深 xff0c 所以就献丑了吧 从高考完了的那一天就
  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小
  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类
  • 如何在Java中调用Python

    Python语言有丰富的系统管理 数据处理 统计类软件包 xff0c 因此从java应用中调用Python代码的需求很常见 实用 DataX 是阿里开源的一个异构数据源离线同步工具 xff0c 致力于实现包括关系型数据库 MySQL Ora
  • 集群多机ROS通信中间件:swarm_ros_bridge

    最近写了一个无线网络环境下 xff08 比如WIFI xff09 多机ROS通信的ROS包 swarm ros bridge xff1a https gitee com shu peixuan swarm ros bridge 该项目已被R
  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中
  • ClickHouse服务端配置最佳实践

    安装好ClickHouse xff0c 需要对服务和用户进行配置 本文介绍ClickHouse建议配置方式 xff0c 配置项修改后是否需要重启 xff0c 另外还提供一些实例配置加深理解 独立自定义配置 Clickhouse 服务端配置包
  • 2014年度总结——软件产品化的简要理解

    2014年度总结 软件产品化的简要理解 2014年转瞬即逝 xff0c 真是让人感慨 xff0c 岁月不是一天天在逝去 xff0c 而是一年年 xff1b 总结一年的工作非常有意义 xff0c 觉得今年最大的变化就是从定制软件到产品化的过度
  • R语言中mean函数

    mean函数是求算术平均值 用法 xff1a mean x trim 61 0 na rm 61 FALSE x是数值型 逻辑向量 trim表示截尾平均数 xff0c 0 0 5之间的数值 xff0c 如 xff1a 0 10表示丢弃最大1
  • 使用Spring @DependsOn控制bean加载顺序

    使用Spring 64 DependsOn控制bean加载顺序 spring容器载入bean顺序是不确定的 xff0c spring框架没有约定特定顺序逻辑规范 但spring保证如果A依赖B 如beanA中有 64 Autowired B