SpringBoot中的@DependsOn注解详解

 更新时间:2023年08月04日 09:07:14   作者:cloneme01  
这篇文章主要介绍了SpringBoot中的@DependsOn注解详解,

@DependsOn

@DependsOn注解主要用于指定当前BEAN所依赖的BEANS。任何被指定的依赖的BEAN都由Spring容器保证在当前BEAN之前创建和加载。

在某些场景下,BEAN不是通过属性或构造函数参数显式依赖于另一个BEAN,但却需要要求另一个BEAN优先完成初始化,则可以使用@DependsOn这个注解。

@DependsOn既可以指定初始化的依赖顺序,也可以指定BEAN相应的销毁执行顺序(仅在单例bean的情况下)。

注解@DependsOn位于如下包

org.springframework.context.annotation

该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。

举例来讲,如果容器通过@DependsOn注解方式定义了bean plant依赖于bean water,那么容器在会确保bean water的实例在实例化bean plant之前完成。

一般用在一个bean没有通过属性或者构造函数参数显式依赖另外一个bean,但实际上会使用到那个bean或者那个bean产生的某些结果的情况。

使用目的

控制BEAN的加载顺序。
用来表示一个BEAN-A的实例化依赖另一个BEAN-B的实例化, 但是BEAN-A并不需要持有一个BEAN-B的对象,如果需要则需要使用依赖注入或者ref标签。

注解源码

// 该注解的属性是一个字符串数组,数组的元素是每个依赖的BEAN的名称。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
	String[] value() default {};
}

官方说明

Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean. Used infrequently in cases where a bean does not explicitly depend on another through properties or constructor arguments, but rather depends on the side effects of another bean's initialization. A depends-on declaration can specify both an initialization-time dependency and, in the case of singleton beans only, a corresponding destruction-time dependency. Dependent beans that define a depends-on relationship with a given bean are destroyed first, prior to the given bean itself being destroyed. Thus, a depends-on declaration can also control shutdown order. May be used on any class directly or indirectly annotated with org.springframework.stereotype.Component or on methods annotated with Bean. Using DependsOn at the class level has no effect unless component-scanning is being used. If a DependsOn-annotated class is declared via XML, DependsOn annotation metadata is ignored, and is respected instead.

使用说明

  • @DependsOn注解可以定义在类和方法上;
  • 直接或者间接标注在带有@Component注解的类上面;
  • 直接或者间接标注在带有@Bean 注解的方法上面;
  • 如果使用的是XML配置,则需要使用标签;
  • @DependsOn({“BEAN-NAME-1”, “BEAN-NAME-2”}),先创建BEAN-NAME-1,再创建BEAN-NAME-2,最后再创建当前的BEAN。

组合使用

可以与@Component注解和@Bean注解组合使用。

示例代码

@DependsOn({"c", "b"})
@Component
public class A implements InitializingBean, DisposableBean {
    public A() {
        System.out.println("TO CREATE: " + this.getClass().getName());
    }
    @Override
    public void afterPropertiesSet() throws Exception {
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("TO DESTROY: " + this.getClass().getName());
    }
}
@Component
public class B implements InitializingBean, DisposableBean {
    public B() {
        System.out.println("TO CREATE: " + this.getClass().getName());
    }
    @Override
    public void afterPropertiesSet() throws Exception {
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("TO DESTROY: " + this.getClass().getName());
    }
}
@Component
public class C implements InitializingBean, DisposableBean {
    public C() {
        System.out.println("TO CREATE: " + this.getClass().getName());
    }
    @Override
    public void afterPropertiesSet() throws Exception {
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("TO DESTROY: " + this.getClass().getName());
    }
}

 加载与创建顺序:C、B、A

销毁顺序与创建顺序相反:A、B、C

@DependsOn和@Lazy的区别

  • @DependsOn注解用于指定各个BEAN的依赖顺序;
  • @Lazy注解用于指定该类是否能够懒加载,也就是说如果一个类不需要在启动时实例化,那么就可以使用@Lazy注解进行懒加载,在第一次使用时创建并实例化。
    • 可以使用@Lazy注解将某些BEAN在第一次使用时创建并加载到SPRING容器中;
    • @Lazy注解只对单例有用,它让BEAN在SPRING启动时不会加载到容器中,只有在代码里第一次调用时才创建并加载到容器中;
    • 如果只在某个类上添加@Lazy注解,但是其他代码依赖了该类,那么即使在该类上添加了@Lazy注解,也依然会在IoC容器初始化时实例化该类,也就是@Lazy注解失效了,这就是由代码之间的依赖导致的@Lazy注解失效;如果希望在使用时才去实例化,那么就需要在每个依赖该类的地方也添加@Lazy注解;
    • 如上代码所示,如果在C这个BEAN上也添加了@Lazy注解,则@Lazy注解也会失效,这就是由@DependsOn注解引起的@Lazy注解失效。

到此这篇关于SpringBoot中的@DependsOn注解详解的文章就介绍到这了,更多相关@DependsOn注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SSM框架前后端信息交互实现流程详解

    SSM框架前后端信息交互实现流程详解

    这篇文章主要介绍了SSM框架前后端信息交互实现流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • spring boot入门之诞生背景及优势影响

    spring boot入门之诞生背景及优势影响

    这篇文章主要为大家描述说明了介绍了spring boot诞生的背景以及其产生的优势影响,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 一文带你探索Java中的通配符与泛型

    一文带你探索Java中的通配符与泛型

    Java 语言中的泛型是一种强大的特性,它可以将类型参数化,使得代码更具通用性和安全性,本文将深入讲解 Java 通配符和泛型,有需要的小伙伴可以了解下
    2023-12-12
  • 宝塔面板配置及部署javaweb教程(全网最全)

    宝塔面板配置及部署javaweb教程(全网最全)

    这篇文章主要介绍了宝塔面板配置及部署javaweb教程(全网最全),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • spring aop pointcut 添加多个execution方式

    spring aop pointcut 添加多个execution方式

    这篇文章主要介绍了spring aop pointcut 添加多个execution方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java 数值类型分秒时间格式化的实例代码

    java 数值类型分秒时间格式化的实例代码

    这篇文章主要介绍了java 数值类型分秒时间格式化的实例代码的相关资料,将秒或分钟的值转换为xx天xx小时xx分钟xx秒 如果 “xx” 为0 自动缺省,需要的朋友可以参考下
    2017-07-07
  • java递归菜单树转换成pojo对象

    java递归菜单树转换成pojo对象

    这篇文章介绍了java递归菜单树转换成pojo对象的具体实现,有需要的朋友可以参考一下
    2013-08-08
  • Java实现PDF导出功能的示例代码

    Java实现PDF导出功能的示例代码

    这篇文章主要为大家详细介绍了Java实现PDF导出功能的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-09-09
  • SpringBoot整合EasyExcel实现批量导入导出

    SpringBoot整合EasyExcel实现批量导入导出

    这篇文章主要为大家详细介绍了SpringBoot整合EasyExcel实现批量导入导出功能的相关知识,文中的示例代码讲解详细,需要的小伙伴可以参考下
    2024-03-03
  • 基于Java编写简单的Excel工具类

    基于Java编写简单的Excel工具类

    这篇文章主要为大家详细介绍了如何基于Java编写简单的Excel工具类,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-02-02

最新评论