java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > @DependsOn注解

SpringBoot中的@DependsOn注解详解

作者: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.

使用说明

组合使用

可以与@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的区别

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

您可能感兴趣的文章:
阅读全文