@AutoConfigureBefore、@AutoConfigureAfter使用细节

背景

我们在定义spring-boot-starter时,有时会使用@AutoConfigureBefore@AutoConfigureAfter来指定自动装配配置之间的加载顺序。

使用此注解要注意两点:

  • 被注解修饰的类要在spring.factories中的org.springframework.boot.autoconfigure.EnableAutoConfiguration指定,不能用@Configuration修饰,否则会立刻被spring扫描到,不能实现指定顺序,之前的文章介绍过
  • @AutoConfigureBefore@AutoConfigureAfter的作用是指定配置类加载的顺序,而不是bean的加载顺序,这点要注意,很多人也是疏忽了这点,本文重点分析的就是此部分

案例

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\test.TestConfig2,\test.TestConfig

TestConfig

public class TestConfig {public TestConfig(){System.out.println("====TestConfig====");}@Beanpublic Base base(){System.out.println("====base1====");return new Base(1);}
}

TestConfig2

@AutoConfigureBefore(TestConfig.class)
public class TestConfig2 {public TestConfig2(){System.out.println("====TestConfig2====");}@Beanpublic Base base(){System.out.println("====base2====");return new Base(2);}@Beanpublic Test test(Base base){return new Test(base);}
}

Test

public class Test {private Base base;public Test(Base base){this.base = base;}@PostConstructpublic void init(){System.out.println("====" + base.i + "====");}
}
  • TestConfigTestConfig2使用自动装配配置
  • TestConfigTestConfig2都生成了类型Base,名字base的bean对象
  • TestConfig2使用@AutoConfigureBefore指定在TestConfig之前进行加载
  • TestConfig2生成了类型Test,名字test的bean对象并注入了类型Bean的bean对象

结果

====TestConfig2====
====TestConfig====
====base1====
====1====

结论

  • @AutoConfigureBefore可以指定TestConfig2TestConfig之前进行生成加载
  • 但不能指定@Bean生成对象的顺序,这里看到注入的Base类型对象是TestConfig生成的

那么要指定bean的加载顺序怎么做?

可以用@ConditionalOnMissingBean注解

案例中只修改TestConfig,其余不变

TestConfig

public class TestConfig {public TestConfig(){System.out.println("====TestConfig====");}@Bean@ConditionalOnMissingBeanpublic Base base(){System.out.println("====base1====");return new Base(1);}
}

结果

====TestConfig2====
====base2====
====2====
====TestConfig====

可以看到可以通过@ConditionalOnMissingBean来控制bean对象的加载顺序

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

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

相关文章

JMeter(三十九):selenium怪异的UI自动化测试组合

文章目录 一、背景二、JMeter+selenium使用过程三、总结一、背景 题主多年前在某社区看到有人使用jmeter+selenium做UI自动化测试的时候,感觉很是诧异、怪异,为啥?众所周知在python/java+selenium+testng/pytest这样的组合框架下,为啥要选择jmeter这个东西[本身定位是接口测…

C# 子类如何访问子类的方法(同一父类)

在继承关系中,子类可以通过创建另一个子类的对象来访问其方法。下面是一个示例,展示了子类如何访问另一个子类的方法: public class Animal {public virtual void Speak(){Console.WriteLine("我是动物。");} }public class Cat :…

liunx下ubuntu基础知识学习记录

使用乌班图 命令安装使用安装网络相关工具安装dstat抓包工具需要在Ubuntu内安装openssh-server gcc安装vim安装hello word输出1. 首先安装gcc 安装这个就可以把gcc g一起安装2. 安装VIM3.编译运行代码 解决ubuntu与主机不能粘贴复制 命令安装使用 安装网络相关工具 使用ifconf…

C语言系统化精讲(一):C 语言开发环境搭建

文章目录 一、Windows 开发环境搭建1.1 安装 mingw 编译器1.2 下载并安装 CLion1.3 启动 CLion 二、Linux 开发环境搭建(建议使用)2.1 VMware Workstation Pro软件简介及安装2.2 安装 Ubuntu 系统2.2.1 Ubuntu 下载2.2.2 安装 Ubuntu2.2.3 安装共享文件夹…

智能手机收入和出货量双双下滑,造车成本不断增长,小米集团仍面临风险

来源:猛兽财经 作者:猛兽财经 华尔街分析师对小米集团第二季度的业绩预测 在8月29日小米集团(01810)公布其2023年第二季度财报之前,华尔街分析师曾预测该公司第二季度的业绩将超出2023年第一季度的业绩。 根据S&P …

实现无公网IP环境下远程访问本地Jupyter Notebook服务的方法及端口映射

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook,它是一个交互式的数据科学和计算环境,支持多种编程语言,如…

git 后悔药

前言 自上而下,撤销可以分为从远程库撤销,从本地库撤销,从暂存库撤销。 例子:代码已经提交了三个记录到远程库,分别对应了记录1,内容1,记录2,内容2,记录3,内…

【C++杂货铺】探索list的底层实现

文章目录 一、list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity(容量相关)1.2.4 list element access(元素访问)1.2.5 list modifiers(链表修改&#xff0…

网站监控系统最佳实践之静态资源采样上报

作者 观测云 产品服务部门 深圳团队 朱端畅 背景说明 通过 RUM 采集前端数据时,若采集的数据过多,可能会导致占用过多的网络带宽以及其他资源。特别是刚进入首页加载数据时,可能会调用几十次甚至更多次 v1/write/rum?precisionms数据采集接…

swagger---接口文档管理生成管理工具

Swagger–接口生成工具 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具, 就可以做到生成各种格式的接口文档,以及在线接口调试页面等等。 官网: https://lswagger.io/knife4j是为Jav…

数学建模:Logistic回归预测

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:Logistic回归预测 Logistic回归预测 logistic方程的定义: x t 1 c a e b t x_{t}\frac{1}{cae^{bt}}\quad xt​caebt1​ d x d t − a b e b t ( c a e b t ) 2 >…

Java 内部类

目录 一、什么是内部类及为何要有内部类 二、四种内部类 1.成员内部类 成员内部类定义: 获取成员内部类对象的方法: 成员内部类获取外部类变量: 额外: 2.局部内部类 局部内部类定义: 如何实现内部类当中的方法: 3.静态内…

Java复习-20-接口(3)- 代理设计模式

代理设计模式(Proxy) 功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目…

自动化测试系列 —— UI自动化测试

UI 测试是一种测试类型,也称为用户界面测试,通过该测试,我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要,通过执行 UI 测试…

AR产业变革中的“关键先生”和“关键力量”

今年6月的WWDC大会上,苹果发布了头显产品Vision Pro,苹果CEO库克形容它: 开启了空间计算时代。 AR产业曾红极一时,但因为一些技术硬伤又减弱了声量,整个产业在起伏中前行。必须承认,这次苹果发布Vision P…

zabbix监控网络设备和zabbix proxy

监控linux主机 [rootrocky8 conf]# yum -y install net-snmp vim /etc/snmp/snmpd.conf com2sec notConfigUser default 123456##修改此行,设置团体密码,默认为public,此处 改为123456 view systemview included .1. ##添加此行,自定义授权,否则 zabbix 无法获取数据 [rootr…

什么合同管理系统?4类合同管理软件评测

说到合同管理系统,前提还是弄清楚合同有哪些类型,合同管理有那些痛点,才好对症下药。 一、合同的类型和合同管理的痛点 从法律角度来说,合同可以分为:有名合同与无名合同、单务合同与双务合同、有偿合同与无偿合同、…

conda环境安装opencv带cuda版本

主要是cmake编译选项需要修改 以下两个选项按照自己情况修改 -D OPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-12.2 \ 其中/home/lixin/anaconda3/envs/stereo 改成你自己的conda环境 cmake -D CMAKE_BUILD_TYPER…

MySQL阻塞与死锁

MySQL阻塞与死锁 阻塞 因为不同锁之间的兼容性关系,在有些时刻一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源,这就是阻塞。 # 查看等待时间 show variables like innodb_lock_wait_timeout; SETinnodb_lock_wait_timeout60; # 是否在等待…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看…