Spring中@DependsOn 使用详解
一、注解源码
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DependsOn { String[] value() default {}; }
二、基础概念
@DependsOn是Spring框架用来指定bean之间依赖关系的注解之一,即可用户类上,也可用户方法上。当我们在配置Spring的bean时,有些情况下一个bean可能会依赖于另外
一个bean的初始化(但是并不需要持有,如果需要持有直接注入即可,同时也会保证顺序),此时就可以使用@DependsOn来指定依赖关系,确保它们的初始化顺序得到保证。
作用在类上:
@Component(value = "dependsOnClassA") @DependsOn(value = {"dependsOnClassB"}) public class DependsOnClassA { private final Logger logger = LoggerFactory.getLogger(DependsOnClassA.class); public DependsOnClassA(){ logger.info("执行DependsOnClassA的构造方法"); } }
可以看到,DependsOnClassA类上使用@Component注解标注,并且指定了Bean的名称为dependsOnClassA(若不指定默认驼峰),以及使用@DependsOn注解指定了依赖的Bean名称为dependsOnClassB。
@Component(value = "dependsOnClassB") public class DependsOnClassB { private final Logger logger = LoggerFactory.getLogger(DependsOnClassB.class); public DependsOnClassB(){ logger.info("执行DependsOnClassB的构造方法"); } }
可以看到,在DependsOnClassB类上标注了@Component注解,指定了Bean对象的名称为dependsOnClassB。由DependsOnClassA类和DependsOnClassB类可以看出,在Spring中创建DependsOnClassA类的对象时,会依赖DependsOnClassB类的对象。所以,在Spring中,创建DependsOnClassA类的对象之前,会先创建DependsOnClassB类的对象。
需要注意的是,使用@DependsOn注解应该尽量避免出现循环依赖(即 A 依赖于 B,而 B 又依赖于 A),否则会导致应用程序启动失败。同时,这种方式也会使代码显得不够优雅,因此在实际开发中建议使用更好的依赖注入方式,尽量避免使用@DependsOn注解。
更多详细和源码见:https://developer.aliyun.com/article/1177892