Spring注解@DependsOn解析
作者:刘牌 发布时间:2022-01-11 08:20:35
介绍
今天要分享得是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,没有的话就往下执行。
来源:https://juejin.cn/post/7221206168425070649


猜你喜欢
- 一、Android 个人手机通讯录开发数据存储:SQLite 数据库开发工具:Android Studio二、Phone Module 简介
- BeanUtils.copyProperties无法封装使用BeanUtils.copyProperties(user, memeber);
- 在上一篇文章中,我们学习了Camera的基本用法,并借助它们编写了一个例子,实现了类似于API Demos里的图片中轴旋转功能。不过那个例子
- 前言最近公司产品突然有一个类似支付宝蚂蚁森林的功能,大致功能跟支付宝蚂蚁森林相像,在看了一下支付宝蚂蚁森林的效果之后,打算先撸一个控件出来,
- 本文实例为大家分享了C#超市收银系统设计的具体代码,供大家参考,具体内容如下1.登录界面代码如下:using System;using Sy
- 首先,引入依赖:<dependency> <groupId>org.springframe
- 前言想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级
- 一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的方
- 实践过程效果代码class BaseClass{ public class Win32
- 前言:Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内
- 1 spring-retry是什么?以往我们在进行网络请求的时候,需要考虑网络异常的情况,本文就介绍了利用spring-retry,是spr
- 首先写布局文件activity_main.xml:<LinearLayout xmlns:android="http://s
- 1、LongAdder由来LongAdder类是JDK1.8新增的一个原子性操作类。AtomicLong通过CAS算法提供了非阻塞的原子性操
- 背景ELMAH就是一个日志的拦截和处理组件,说到.net的日志组件,大家的第一反应该是Log4Net、NLog等这些东西,关于Log4Net
- 通过javamail 实现发送邮件,供大家参考,具体内容如 * 意:服务器有些端口是没有开放的 需要去开放端口。 有些邮箱是需要开启对应授权服
- java 深拷贝与浅拷贝机制详解概要:在Java中,拷贝分为深拷贝和浅拷贝两种。java在公共超类Object中实现了一种叫做c
- 代码如下所示: public static Bitmap
- 一、引言90坦克大战,很经典的一款游戏,当年与小伙伴一人一个手柄,搬上小板凳坐在电视机前,身体时不时跟随手柄摇晃着,时而表情严肃、眉头紧锁,
- 一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:p
- public static string Escape(string s) &nb