【spring】@DependsOn注解学习

news2024/11/18 19:36:24

@DependsOn介绍

@DependsOn 是 Spring 框架中的一个注解,用于指定一个 bean 的依赖关系。当 Spring 容器初始化 bean 时,它会按照一定的顺序进行初始化。如果一个 bean 依赖于其他 bean,那么这个 bean 的初始化应该在依赖的 bean 之后进行。

@DependsOn 注解可以用于指定一个 bean 依赖于哪些 bean,这样 Spring 容器在初始化 bean 时,会先初始化依赖的 bean,然后再初始化当前 bean。

@DependsOn 注解的使用方式如下:

@Component
@DependsOn("otherBean")
public class DemoBean {
    // ...
}

在上面的代码中,DemoBean依赖于 otherBean,因此当 Spring 容器初始化 MyBean 时,会先初始化 otherBean

@DependsOn 注解只能用于 Spring 容器管理的 bean,不能用于普通的 Java 对象。此外,@DependsOn 注解只能用于指定 bean 的依赖关系,不能用于指定 bean 的初始化顺序。如果需要指定 bean 的初始化顺序,可以使用 @Order 注解或者手动配置 bean 的初始化顺序。

@DependsOn源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
	String[] value() default {};
}
源代码截图

@DependsOn属性介绍

  • value:表示指定的Bean的唯一标识,被指定的Bean会在Spring创建当前Bean之前被创建

@DependsOn注解使用场景

  1. 资源初始化依赖:有时,一个Bean的初始化需要依赖于另一个Bean已经初始化完毕后提供的资源,如数据库连接、线程池等。例如,一个服务类需要使用到已配置好的DataSource Bean,这时可以在该服务类上标注@DependsOn("dataSource"),确保数据源Bean在该服务类之前被初始化。

  2. 逻辑执行顺序依赖:在某些业务场景下,Bean的初始化顺序可能直接影响到业务逻辑的正确执行。例如,一个负责处理消息的服务类依赖于另一个负责配置消息队列连接的服务类,这时就需要用@DependsOn来确保配置服务类先于处理服务类初始化。

  3. 避免循环依赖问题:尽管Spring框架能够解决大部分的循环依赖问题,但在某些特殊情况下,通过明确指定Bean的依赖顺序,可以有效地防止因为初始化顺序导致的问题。

  4. 生命周期管理:对于具有特定生命周期的Bean,如一些需要在其他Bean销毁前先行关闭或清理的资源,也可以通过@DependsOn来控制其销毁顺序。

@DependsOn测试示例代码

示例代码 一

DependsOnDemo1类
package com.yang.SpringTest.annotation.dependsOnLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

/**
 * <p>dependsOnLearn 对象1</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.dependsOnLearn
 * Ceate Time 2024-03-19 13:53
 */
@Slf4j
@Component(value = "dependsOnDemo1")
@DependsOn(value = {"dependsOnDemo2"})
public class DependsOnDemo1 {

    public DependsOnDemo1() {
        log.info("-----DependsOnDemo1 init-----");
    }
}
DependsOnDemo2类
package com.yang.SpringTest.annotation.dependsOnLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

/**
 * <p>dependsOnLearn 对象2</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.dependsOnLearn
 * Ceate Time 2024-03-19 13:53
 */
@Slf4j
@Component(value = "dependsOnDemo2")
public class DependsOnDemo2 {

    public DependsOnDemo2() {
        log.info("-----DependsOnDemo2 init-----");
    }
}
DependsOnDemoConfig配置类
package com.yang.SpringTest.annotation.dependsOnLearn;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * <p>dependsOnLearn 配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.dependsOnLearn
 * Ceate Time 2024-03-19 13:55
 */
@Configuration
@ComponentScan(basePackages = "com.yang.SpringTest.annotation.dependsOnLearn")
public class DependsOnDemoConfig {
}
DependsOnDemoTest测试类
package com.yang.SpringTest.annotation.dependsOnLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * <p>dependsOnLearn 测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.dependsOnLearn
 * Ceate Time 2024-03-19 13:57
 */

public class DependsOnDemoTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependsOnDemoConfig.class);

    }
}
运行结果

DependsOnDemo2 比 DependsOnDemo1先一步初始化了。




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

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

相关文章

2024年noc指导教师认证测评参考试题题目3-4合集

[noc指导教师认证] 测评参考试题 说明:NOC教师指导认证考试题目是从题库里抽题,因此每位老师每次考试题目都不一样以下题目为测试考试时收集到的一些题目,作为辅助提供给各位老师,老师们可以记住题目及答案的具体内容 (选项顺序会变),以免考试时遇到。2024年的做的题目有的…

MISC:zip压缩包伪加密破解及其结构解析

一.前言 遇到zip压缩包是被加密的&#xff0c;但加密有时侯是伪加密&#xff0c;需要我们进行破解。 二.压缩包解析 1. 压缩源文件数据区 zip文件头标记 文件头&#xff1a;504B0304 解压文件所需的pkware版本 全局方式位标记 如果四位中的第二位为奇数则表示有加密&#xff…

Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中&#xff0c;我们将了解如何将现有数据流&#xff0…

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…

JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…

Web框架开发-Ajax

一、 Ajax准备知识:json 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式 1 2 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。…

手撕算法-删除有序数组中的重复项 II

描述 例如&#xff1a;输入&#xff1a;nums [1,1,1,2,2,3]输出&#xff1a;5, nums [1,1,2,2,3]解释&#xff1a;函数应返回新长度 length 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。 分析 双指针, fast, slow。nums[…

Redis高阶使用消息队列分布式锁排行榜等

一、前言 在大多数传统的web系统中&#xff0c;使用Redis一般都是作为缓存使用&#xff0c;在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用&#xff0c;还有做了注册中心&#xff0c;分布式事务。其他的强大的功能&#xff0c;没有…

【微服务】以模块化单体架构开发微服务应用

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战我们知道,起初,单体应用有显著的优势:它们更容易开发和部署。从开发人员的角度来看,这种简单性是有益的。一切都是集中的,可以快速更新任何部分的业务逻辑并立即看到结果。这种开…

2024046期传足14场胜负前瞻

2024046期售止时间为3月26日&#xff08;周二&#xff09;19点30分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率5场&#xff0c;1.5-2.0赔率4场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度不大。以下为基础盘前瞻&#xff0c;大家可根据自身…

CSS3实现的分享图标按钮动画特效代码

CSS3分享图标按钮动画特效代码是一款社会分享图标动画特效&#xff0c;鼠标移上去会有一个胶囊闪动的效果。源码由HTMLCSSJS组成&#xff0c;适合绝大部分web网站&#xff0c;可以把它做成一个组件添加到网站的文章页下面&#xff0c;给网站添加一个文章分享功能&#xff0c;也…

私有化视频会议的重要性与优势,WorkPlus Meet助您安全高效沟通

高效的视频会议是推动沟通与协作的重要手段。而选择私有化视频会议平台&#xff0c;保障企业信息安全和会议效果则显得尤为重要。WorkPlus Meet以其卓越的性能和全面的功能&#xff0c;助力企业实现私有化视频会议&#xff0c;提升沟通效果与协作效率。 私有化视频会议的重要性…

关于Java发邮件提醒写周报实现(一)环境搭建

背景 由于公司每周都要写周报&#xff0c;而日常工作很忙&#xff0c;所以很容易忘记这件事件&#xff0c;因此开发一个写周报提醒的机器人&#xff0c;进行特定时间提醒是时候写周报了。 有一个大前提&#xff0c;本技术实现&#xff0c;本着不开通任何收费服务的态度去考察使…

Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…

亚马逊跨境电商为什么要多备几个店铺?多店铺运营技巧

在亚马逊&#xff0c;链接断货超过15天的话就会降权&#xff0c;之后想要把权重升回来是要下不少功夫的&#xff0c;如果这时候有一个备用店铺的话&#xff0c;就可以跟卖自己大号的链接&#xff0c;先保持出单&#xff0c;把权重稳住那么多店铺就需要多个信用卡进行扣店铺租金…

小车倒立摆系统极点配置,LQR闭环控制

在之前直流电机控制仿真里有讲过状态控制的基本架构&#xff0c;有兴趣的同学可以再回去看看&#xff0c;链接如下好玩的直流电机调速实验、PID、极点配置、LQR、观测器&#xff1b;不讲大道理_lqr控制器观测器-CSDN博客 在专栏的前三篇文章 小车倒立摆物理建模与simulink仿真…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…

Git——IDEA中的使用详解

目录 Git1、IDEA中配置Git2、将本地项目推送到远程仓库2.1、创建项目远程仓库2.2、初始化本地仓库2.3、连接远程仓库2.4、提交到本地仓库2.5、推送到远程仓库 3、克隆远程仓库到本地4、基本操作4.1、代码提交到暂存区4.2、暂存区代码提交到本地库4.3、推送到远程仓库4.4、撤销本…

主干网络篇 | YOLOv8改进之在主干网络中引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

【CDA二级数据分析备考思维导图】

CDA二级数据分析备考思维导图 CDA二级复习备考资料共计七个章节&#xff0c;如需资料&#xff0c;请留言&#xff0c;概览如下图&#xff1a;一、数据采集与处理1.数据采集方法2.市场调研和数据录入3、数据探索与可视化4、数据预处理方法 总结&#xff1a;以上为自己学习数据分…