depends on(Spring注解@DependsOn怎么使用)

发布时间:2025-12-10 23:35:58 浏览次数:1

注解详情

@DependsOn注解可以标注在类上和方法上面,只有一个属性value,它是一个数组,表示依赖的bean名称的数组,可以指定一个或者多个。

@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceDependsOn{String[]value()default{};

使用

如下,在DependsOnBeanA上标注了@DependsOn注解,那么DependsOnBeanA需要在Bean dependsOnBeanB创建完成之后才能创建自己,这里value的值为bean的名称,如果没有对bean设置名称,那么就为首字母为小写的类名。

@Component@DependsOn(value={"dependsOnBeanB"})publicclassDependsOnBeanA{}

源码解析

spring扫描到所有的标有@Component(@Service,@Repository等注解本质就是@Component)的类和标有@Bean的方法后,会进行处理,这里,它会判断是否标注有@DependsOn,如果标注有,则会设置BeanDefinition的dependsOn,设置其依赖的bean,如下在AnnotationConfigUtils注解工具类中源码如下。

staticvoidprocessCommonDefinitionAnnotations(AnnotatedBeanDefinitionabd,AnnotatedTypeMetadatametadata){//省略若干代码AnnotationAttributesdependsOn=attributesFor(metadata,DependsOn.class);if(dependsOn!=null){abd.setDependsOn(dependsOn.getStringArray("value"));}}

上面是在注册bean元数据阶段,注册元数据阶段只是组装好bean之间的依赖,然后在真正创建bean的时候,才会进行判断,如下在AbstractBeanFactory类中的doGetBean中,会从RootBeanDefinition中取出dependsOn的值,不为空则进行bean的创建,创建bean的过程和其他bean的创建过程也是一样的。

protected<T>TdoGetBean(Stringname,@NullableClass<T>requiredType,@NullableObject[]args,booleantypeCheckOnly)throwsBeansException{RootBeanDefinitionmbd=getMergedLocalBeanDefinition(beanName);//Guaranteeinitializationofbeansthatthecurrentbeandependson.String[]dependsOn=mbd.getDependsOn();if(dependsOn!=null){for(Stringdep:dependsOn){if(isDependent(beanName,dep)){thrownewBeanCreationException(mbd.getResourceDescription(),beanName,"Circulardepends-onrelationshipbetween'"+beanName+"'and'"+dep+"'");}registerDependentBean(dep,beanName);try{getBean(dep);}catch(NoSuchBeanDefinitionExceptionex){thrownewBeanCreationException(mbd.getResourceDescription(),beanName,"'"+beanName+"'dependsonmissingbean'"+dep+"'",ex);}}}}

从上面可以看出,其实还是比较简单,主要就是判断是否有依赖的bean,如果有就先创建依赖的bean,没有的话就往下执行。

“Spring注解@DependsOn怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注本站网站,小编将为大家输出更多高质量的实用文章!

depends on
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477