• 【spring】@DependsOn注解学习


    @DependsOn介绍

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

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

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

    1. @Component
    2. @DependsOn("otherBean")
    3. public class DemoBean {
    4. // ...
    5. }

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

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

    @DependsOn源码

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

    @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类
    1. package com.yang.SpringTest.annotation.dependsOnLearn;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.context.annotation.DependsOn;
    4. import org.springframework.stereotype.Component;
    5. /**
    6. *

      dependsOnLearn 对象1

    7. *
    8. * @author By: chengxuyuanshitang
    9. * Package com.yang.SpringTest.annotation.dependsOnLearn
    10. * Ceate Time 2024-03-19 13:53
    11. */
    12. @Slf4j
    13. @Component(value = "dependsOnDemo1")
    14. @DependsOn(value = {"dependsOnDemo2"})
    15. public class DependsOnDemo1 {
    16. public DependsOnDemo1() {
    17. log.info("-----DependsOnDemo1 init-----");
    18. }
    19. }
    DependsOnDemo2类
    1. package com.yang.SpringTest.annotation.dependsOnLearn;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.context.annotation.DependsOn;
    4. import org.springframework.stereotype.Component;
    5. /**
    6. *

      dependsOnLearn 对象2

    7. *
    8. * @author By: chengxuyuanshitang
    9. * Package com.yang.SpringTest.annotation.dependsOnLearn
    10. * Ceate Time 2024-03-19 13:53
    11. */
    12. @Slf4j
    13. @Component(value = "dependsOnDemo2")
    14. public class DependsOnDemo2 {
    15. public DependsOnDemo2() {
    16. log.info("-----DependsOnDemo2 init-----");
    17. }
    18. }
    DependsOnDemoConfig配置类
    1. package com.yang.SpringTest.annotation.dependsOnLearn;
    2. import org.springframework.context.annotation.ComponentScan;
    3. import org.springframework.context.annotation.Configuration;
    4. /**
    5. *

      dependsOnLearn 配置类

    6. *
    7. * @author By: chengxuyuanshitang
    8. * Package com.yang.SpringTest.annotation.dependsOnLearn
    9. * Ceate Time 2024-03-19 13:55
    10. */
    11. @Configuration
    12. @ComponentScan(basePackages = "com.yang.SpringTest.annotation.dependsOnLearn")
    13. public class DependsOnDemoConfig {
    14. }
    DependsOnDemoTest测试类
    1. package com.yang.SpringTest.annotation.dependsOnLearn;
    2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    3. /**
    4. *

      dependsOnLearn 测试类

    5. *
    6. * @author By: chengxuyuanshitang
    7. * Package com.yang.SpringTest.annotation.dependsOnLearn
    8. * Ceate Time 2024-03-19 13:57
    9. */
    10. public class DependsOnDemoTest {
    11. public static void main(String[] args) {
    12. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependsOnDemoConfig.class);
    13. }
    14. }
    运行结果

    DependsOnDemo2 比 DependsOnDemo1先一步初始化了。




  • 相关阅读:
    排查服务器cpu运行过高
    【高项笔记】No.2 网络和网络协议
    Nginx
    SQLserver-快速复制一行数据到数据库并修改ID
    golang与php的openssl_encrypt加解密
    使用grubby更改RHEL7/8/9的默认内核
    Java实现JSON{参数}占位符名称替换指定的多个变量值
    前后端交互之接后端接口
    组队训练记录(8):2022CCPC威海
    Kubernetes之Controller详解
  • 原文地址:https://blog.csdn.net/wochunyang/article/details/136840179