@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注解使用场景
-
资源初始化依赖:有时,一个Bean的初始化需要依赖于另一个Bean已经初始化完毕后提供的资源,如数据库连接、线程池等。例如,一个服务类需要使用到已配置好的DataSource Bean,这时可以在该服务类上标注
@DependsOn("dataSource")
,确保数据源Bean在该服务类之前被初始化。 -
逻辑执行顺序依赖:在某些业务场景下,Bean的初始化顺序可能直接影响到业务逻辑的正确执行。例如,一个负责处理消息的服务类依赖于另一个负责配置消息队列连接的服务类,这时就需要用
@DependsOn
来确保配置服务类先于处理服务类初始化。 -
避免循环依赖问题:尽管Spring框架能够解决大部分的循环依赖问题,但在某些特殊情况下,通过明确指定Bean的依赖顺序,可以有效地防止因为初始化顺序导致的问题。
-
生命周期管理:对于具有特定生命周期的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先一步初始化了。