SpringBoot之@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder注解

前言

SpringBoot通过@AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter注解,控制自动配置类的实例化顺序。

Spring中控制Bean的实例化顺序

Spring中默认实例化顺序

创建实体类A、B、C
@Component
public class A {public A() {System.out.println("A construct");}
}@Component
public class B {public B() {System.out.println("B construct");}
}@Component
public class C {public C() {System.out.println("C construct");}
}
启动SpringBoot

实例化顺序: A > B > C

Spring中指定实例化顺序(C > B > A)

修改实体类A、B、C
@Component
@DependsOn("b")
public class A {public A() {System.out.println("A construct");}
}@Component
@DependsOn("c")
public class B {public B() {System.out.println("B construct");}
}@Component
public class C {public C() {System.out.println("C construct");}
}
启动SpringBoot

实例化顺序: C > B > A

SpringBoot中控制自动配置类的实例化顺序

SpringBoot中默认实例化顺序

在 resources 文件夹下创建 META-INF 文件夹,在 META-INF 文件夹下创建 spring.factories 文件,整体结构如下:

spring.factories 明细如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ys.boot.auto.D,\
com.ys.boot.auto.E,\
com.ys.boot.auto.F
创建实体类D、E、F
public class D {public D() {System.out.println("D construct");}
}public class E {public E() {System.out.println("E construct");}
}public class F {public F() {System.out.println("F construct");}
}
启动SpringBoot

实例化顺序: D > E > F

使用@DependsOn解决实例化顺序?

修改实体类D、E、F
@DependsOn("e")
public class D {public D() {System.out.println("D construct");}
}@DependsOn("f")
public class E {public E() {System.out.println("E construct");}
}public class F {public F() {System.out.println("F construct");}
}
启动SpringBoot

抛出 org.springframework.beans.factory.NoSuchBeanDefinitionException 

异常原因 : 一般情况下,自动配置的类都不是当前项目的文件,即Spring不会将相关文件扫描成BeanDefinition对象。当我们使用@DependsOn注解的时候,Spring就尝从当前环境中查找或实例化指定名称的Bean,因为找不到相关BeanDefinition对象,所以抛出异常。

SpringBoot中指定实例化顺序(方式一)

修改实体类D、E、F
@AutoConfigureOrder(3)
public class D {public D() {System.out.println("D construct");}
}@AutoConfigureOrder(2)
public class E {public E() {System.out.println("E construct");}
}@AutoConfigureOrder(1)
public class F {public F() {System.out.println("F construct");}
}
启动SpringBoot

实例化顺序: F > E > D

SpringBoot中指定实例化顺序(方式二)

修改实体类D、E、F
@AutoConfigureAfter(E.class)
public class D {public D() {System.out.println("D construct");}
}@AutoConfigureAfter(F.class)
public class E {public E() {System.out.println("E construct");}
}public class F {public F() {System.out.println("F construct");}
}
启动SpringBoot

实例化顺序: F > E > D

源码简析

AutoConfigurationSorter#getInPriorityOrder

List<String> getInPriorityOrder(Collection<String> classNames) {AutoConfigurationSorter.AutoConfigurationClasses classes = new AutoConfigurationSorter.AutoConfigurationClasses(this.metadataReaderFactory,this.autoConfigurationMetadata, classNames);List<String> orderedClassNames = new ArrayList<>(classNames);// 最初按字母顺序排序Collections.sort(orderedClassNames);// 根据@AutoConfigureOrder的order值排序,值越小,优先级越高orderedClassNames.sort((o1, o2) -> {int i1 = classes.get(o1).getOrder();int i2 = classes.get(o2).getOrder();return Integer.compare(i1, i2);});// 根据@AutoConfigureBefore、@AutoConfigureAfter注解指定的顺序排序orderedClassNames = sortByAnnotation(classes, orderedClassNames);return orderedClassNames;
}

排序优先级 : 

  1. 根据@AutoConfigureBefore、@AutoConfigureAfter注解指定的顺序排序
  2. 根据@AutoConfigureOrder的order值排序
  3. 按字母顺序排序

@AutoConfigureBefore、@AutoConfigureAfter配置不当可能会抛出异常,案例演示如下:

@AutoConfigureAfter(E.class)
public class D {public D() {System.out.println("D construct");}
}@AutoConfigureAfter(F.class)
public class E {public E() {System.out.println("E construct");}
}@AutoConfigureAfter(D.class)
public class F {public F() {System.out.println("F construct");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【退役之重学Java】JVM 内存模型和 GC 简述

一、JVM 内存 栈区&#xff1a;存放所有最直接变量&#xff0c;如果是基本数据类型&#xff0c;则存放其值&#xff0c;如果是引用类型&#xff0c;则存放其地址值堆区&#xff1a;对象的存放区域&#xff0c;如果有对象的属性还是一个对象&#xff0c;那么会采用链式存储&…

编程中的模块迷宫:区分与正确使用

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、模块混淆的陷阱 二、碳模块与探母模块的区别 三、如何正确使用模块 四、代码示例 五…

CR渲染噪点严重怎么办?常见噪点来源+排查方法

使用Corona渲染器进行渲染时&#xff0c;画面出现噪点是常见现象&#xff0c;尤其是在渲染初期。轻微的高频噪点通常是正常的&#xff0c;但如果经过多次渲染或长时间渲染后噪点依然明显&#xff0c;就可能意味着渲染设置或场景本身存在问题。虽然我们可以利用降噪功能模糊噪点…

NameSilo + Cloudflare 给网站加个域名(附 NameSilo 购买域名优惠码)

网站做好了之后,下一步就是买域名 在国内买域名的话,还需要备案,个人名下备案好像是还有限制,我就去 NameSilo 上面买的 在买之前,对比过几家 比如: godaddy/namecheap/cloudflare 本来是倾向于在 godaddy 上面买的,因为它支持支付宝支付,但是在详细看的时候,发现如果购买一年…

文心一言 VS 讯飞星火 VS chatgpt (269)-- 算法导论20.2 4题

四、修改 proto-vEB 结构&#xff0c;以支持重复关键字。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在原始的 van Emde Boas 树&#xff08;vEB tree&#xff09;结构中&#xff0c;关键字&#xff08;key&#xff09;是唯一的&#xff0c;不允许有重复的关…

DL/ML/RL/TL/FL机器学习框架总结

前言 本文总结了DL/深度学习、ML/机器学习、DML/分布式机器学习、AutoML/自动化机器学习、RL/强化学习、MLaaS/机器学习及服务、SR/语音识别领域的机器学习框架&#xff0c;可作为学习、研究、研发的参考资料。 1.DL/深度学习框架 PyTorch PyTorch是一个开源的Python机器学…

git的使用之筛选文件上传到远程服务器仓库

.gitignore 让本地文件有选择上传到远程服务器仓库 下面是linux内核的.gitignore # # NOTE! Dont add files that are generated in specific # subdirectories here. Add them in the ".gitignore" file # in that subdirectory instead. # # NOTE! Please use gi…

使用fastJSON进行json格式的转换

前言&#xff1a;JSON在传输数据时&#xff0c;起到了特别大的作用&#xff0c;本文是采用的是com.alibaba.fastjson第三方包完成json格式的转换 一、首先导入maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson&…

Github 2024-05-27 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-27统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目3HTML项目1Go项目1非开发语言项目1Rust项目1Svelte项目1Jupyter Notebook项目1免费编程书籍和学习资源清单 创建周期…

Xinstall:开启携带参数注册新时代,提升用户体验与运营效率

在移动互联网时代&#xff0c;App推广和运营面临着诸多挑战。其中&#xff0c;如何精准追踪用户来源、评估推广效果以及优化用户体验&#xff0c;一直是开发者们关注的焦点。而Xinstall作为一家一站式App全渠道统计服务商&#xff0c;通过其独特的携带参数注册功能&#xff0c;…

C语言布尔类型的前世今生

起初&#xff0c;C语言并没有布尔类型&#xff0c;都是使用int类型的变量来表示布尔值&#xff08;时至今日大家也基本都这样弄&#xff09;。_Bool是C99标准&#xff08;1999年的标准&#xff09;新增的数据类型&#xff0c;用于表示布尔值&#xff08;即逻辑值true和false&am…

solidworks 3D草图案例2-方块异形切

单位mm 单位mm 长方体 底面是48mm*48mm&#xff0c;高为60mm 3D草图 点击线&#xff0c;根据三视图&#xff0c;绘制角度线&#xff0c; 由于三点确定一个面&#xff0c;因此确定三点就可以了 基准面 点击参考几何体-基准面&#xff0c;依次点击3个点 曲面切除 完成后点击插…

TextFormField onSave 和onChange

背景&#xff1a;用户在注册发送验证码的时候&#xff0c;发现一直获取不了_username 原因&#xff1a;_username 用的是 TextFormField onSave 由于这个时候表单并未提交,未触发onSave事件&#xff0c;所以一直取不到_username的值。 submit() {var state this._formKey.cur…

POLARDB:新零售用户MySQL上云最佳选择

什么是云数据库POLARDB&#xff1f; POLARDB是阿里云自主研发的最新一代RDS关系型数据库&#xff0c;是特别针对互联网场景设计的Cloud-Native 云原生数据库。POLARDB for MySQL版本&#xff0c;在提供100%兼容MySQL5.6/8.0的关系型事务处理ACID特性之上&#xff0c;能够提供完…

记录集连接——kettle开发25

一、记录集连接 记录集连接就像数据库的左连接、右连接、内连接、外连接。 需要注意的是&#xff0c;因为我们是对数据流进行操作&#xff0c;因此我们在进行记录集连接操作前&#xff0c;需要先将数据进行排序。 新版的KETTLE&#xff0c;名字都改了&#xff0c;叫Merge joi…

# WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办?

WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办&#xff1f; 解决方法&#xff1a; 1、右键【开始】菜单&#xff0c;点击【Windows PowerShell (管理员)】&#xff0c;输入&#xff1a; Get-AppxPackage -allusers | Select Name, PackageFullName 2、查询…

输入与输出的魔法:探索Python的内置函数

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、从键盘捕获输入&#xff1a;input()函数的力量 二、打印输出&#xff1a;print()函数的…

R语言学习 - 箱线图一步法

箱线图 - 一步绘制 绘图时通常会碰到两个头疼的问题&#xff1a; 1、有时需要绘制很多的图&#xff0c;唯一的不同就是输入文件&#xff0c;其它都不需要修改。如果用R脚本&#xff0c;需要反复替换文件名&#xff0c;繁琐又容易出错。 (R也有命令行参数&#xff0c;不熟&…

Python爬虫编写指南

一、确定目标 在开始编写爬虫之前&#xff0c;你需要明确你的目标。你想要从哪个网站抓取数据&#xff1f;你想要获取哪些信息&#xff1f;这些信息通常通过查看网站的HTML结构来确定。 二、选择工具 Python是一个强大的编程语言&#xff0c;有许多库可以帮助你编写爬虫&…

yudao 文件分片上传

FileController GetMapping("/file-url")Operation(summary "获取文件地址")ApiResponse(description "0文件不存在")OperateLog(enable false)public CommonResult<String> getFileUrl(String identifier) {String url0 fileService.…