Spring注解@DependsOn解析

 更新时间:2023年04月23日 11:21:59   作者:刘牌  
今天要分享得是Spring的@DependsOn注解,对于@DependsOn,我们从它的名称里面就能看出意思是“依赖于”,那么在Spring中,它的作用就是解决Bean的创建依赖,感兴趣的小伙伴快来阅读吧

介绍

今天要分享得是Spring的@DependsOn注解,对于@DependsOn,我们从它的名称里面就能看出意思是“依赖于”,那么在Spring中,它的作用就是解决Bean的创建依赖,比如某个Bean在创建的时候依赖另外一个bean,所以需要另外一个bean先创建,然后再创建自己。

注解详情

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {

	String[] value() default {};

使用

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

@Component
@DependsOn(value = {"dependsOnBeanB"})
public class DependsOnBeanA {

}

源码解析

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

static void processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd, AnnotatedTypeMetadata metadata) {
    //省略若干代码
		AnnotationAttributes dependsOn = attributesFor(metadata, DependsOn.class);
		if (dependsOn != null) {
			  abd.setDependsOn(dependsOn.getStringArray("value"));
		}
	}

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

 protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
            throws BeansException {
        RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
        // Guarantee initialization of beans that the current bean depends on.
        String[] dependsOn = mbd.getDependsOn();
        if (dependsOn != null) {
            for (String dep : dependsOn) {
                if (isDependent(beanName, dep)) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                }
                    registerDependentBean(dep, beanName);
                try {
                    getBean(dep);
                } catch (NoSuchBeanDefinitionException ex) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                }
            }
        }
    }

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

总结

上面我们对@DependsOn作了简单的介绍,对其的使用方法进行简单示例,也对核心源码进行分析,还是比较简单,他们都是bean创建过程中的一些增强,spring的创建过程还是比较简单,但是就是因为它的功能点比较多,所以在创建过程中会有各种扩展,各种判断,所以就会变得很复杂,不过它的主线还是比较清晰的,在进行分析的时候,可以先从主线进行分析,然后再慢慢去看主线分出去的逻辑。

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

相关文章

  • Java使用itext5实现PDF表格文档导出

    Java使用itext5实现PDF表格文档导出

    这篇文章主要介绍了Java使用itext5实现PDF表格文档导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java核心编程之文件过滤类FileFilter和FilenameFilter

    java核心编程之文件过滤类FileFilter和FilenameFilter

    这篇文章主要为大家详细介绍了java文件过滤类FileFilter和FilenameFilter,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • IDEA上运行Flink任务的实战教程

    IDEA上运行Flink任务的实战教程

    这篇文章主要介绍了IDEA上运行Flink任务的实战教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • springboot实现敏感字段加密存储解密显示功能

    springboot实现敏感字段加密存储解密显示功能

    这篇文章主要介绍了springboot实现敏感字段加密存储,解密显示,通过mybatis,自定义注解+AOP切面,Base64加解密方式实现功能,本文通过代码实现给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 详解Java实现缓存(LRU,FIFO)

    详解Java实现缓存(LRU,FIFO)

    本篇文章主要介绍了详解Java实现缓存(LRU,FIFO) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringBoot配置shiro安全框架的实现

    SpringBoot配置shiro安全框架的实现

    这篇文章主要介绍了SpringBoot配置shiro安全框架的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 浅谈Java响应式系统

    浅谈Java响应式系统

    第一次听到reactive这个词还是在几年前,偶然了解到了Rxjava这个项目,仿佛为我打开了一扇新的大门,Rxjava是ReactiveX的java实现,ReactiveX家族除了Rxjava还有RxJS, Rx.NET,RxScala等等。
    2021-06-06
  • Golang Protocol Buffer案例详解

    Golang Protocol Buffer案例详解

    这篇文章主要介绍了Golang Protocol Buffer案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java快速掌握Vector类方法

    Java快速掌握Vector类方法

    Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:Vector 是同步访问的;Vector 包含了许多传统的方法,这些方法不属于集合框架
    2022-03-03
  • java中对Redis的缓存进行操作的示例代码

    java中对Redis的缓存进行操作的示例代码

    本篇文章主要介绍了java中对Redis的缓存进行操作的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08

最新评论