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

news2024/10/6 16:19:40

前言

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.coloradmin.cn/o/1711057.html

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

相关文章

小熊家务帮day5 客户管理模块1 (小程序认证,手机验证码认证等)

客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…

The 2022 ICPC Asia Nanjing Regional Contest - External G

题目链接:Problem - D - Codeforces 写在前面&#xff1a;今天的训练赛打的稀碎&#xff0c;一道稍微难一点的签到题就把我难住了&#xff0c;看完题解确实感觉不难&#xff0c;看来题目还是刷太少了。 回归正题 题意&#xff1a; 思路&#xff1a;尽量让分子大&#xff0c;分…

操作系统实验三 可变分区内存分配首次适应算法模拟

实验三 可变分区内存分配首次适应算法模拟 实验内容 模拟内存分配&#xff0c;了解并掌握动态分区分配中所用的数据结构、分区分配算法&#xff0c;深刻理解首次适应内存分配算法。 模拟实现可变分区内存分配首次适应算法&#xff1b;空闲分区表要求有空闲块的起始地址、大小…

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

使用Python发送电子邮件

大家好&#xff0c;当我们需要迅速、方便地与他人沟通时&#xff0c;电子邮件是无疑是一种不可或缺的通信工具。无论是在个人生活中还是工作场合&#xff0c;电子邮件都是我们日常生活中的重要组成部分。它不仅能够传递文字信息&#xff0c;还可以发送附件、链接和嵌入式多媒体…

AJAX基础知识

定义 Ajax 异步 JavaScript 和 XML &#xff08; async javascript and xml &#xff09;&#xff0c;使用 Ajax 技术网页应用能够快速地将数据更新呈现在用户界面上&#xff0c;而不需要重载&#xff08;刷新&#xff09;整个页面&#xff0c;这使得程序能够更快地回应用户的操…

6、xss-labs之level8

1、测试分析 传入123查看页面源码&#xff0c;发现传入的值传给了value和a标签的href&#xff0c;并且对特殊字符<>" 都进行了HTML实体化&#xff0c;对于大小写进行了转化&#xff0c;过滤掉了src、data、onfocus、href、script、"&#xff08;双引号&#…

JAVA学习路线图

计算机网课资料分享群&#xff1a;710895979

每天写两道(二)LRU缓存、

146.LRU 缓存 . - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

蓝桥杯第1022题 玩具蛇 基础DFS C++ Java

题目 思路和解题方法 问题理解&#xff1a;此题要求找出将一条由16节正方形构成的玩具蛇放入4x4的方格中的不同方式数。每节蛇可以是直线或直角转弯&#xff0c;且蛇的形状需要完全覆盖盒子里的16个格子&#xff0c;每个格子仅被蛇的一个部分占据。 状态表示&#xff1a;使用一…

Mesa软件框架以及重要数据结构分析

Mesa软件框架以及重要数据结构分析 引言 Mesa的实现比较复杂&#xff0c;其中还有许多的数据结构之间的关系逻辑还不是很清楚。感觉分析了又没有分析一样&#xff0c;这里我们再理一理&#xff01; 1.1 Mesa下EGL/GL核心数据结构和层级关系 MESA的核心数据结构很多很复杂&#…

猜猜我是谁游戏

猜谜过程 在TabControl控件中&#xff0c;第一个tab中放了一个PictureBox&#xff0c;里面有一张黑色的图片。 玩家点击显示答案按钮&#xff0c;切换图片。 设计器 private void button1_Click(object sender, EventArgs e){this.pictureBox1.Image Image.FromFile(&qu…

多模态大模型:系统、趋势与问题

引言 多模态大模型是当今人工智能领域的热门方向之一。它不仅能处理文本&#xff0c;还能理解和生成图像、视频、语音等多种模态的数据。这种能力使得多模态大模型在自然语言处理、计算机视觉等多个领域展示出巨大的潜力和应用价值。那么&#xff0c;多模态大模型是如何训练出…

【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)

【LeetCode刷题】Day 10 题目1&#xff1a;30. 串联所有单词的子串&#xff08;困难&#xff09;思路分析&#xff1a;思路1&#xff1a;滑动窗口哈希map 题目2&#xff1a;LCR 017.最小覆盖子串思路分析思路1&#xff1a;滑动窗口哈希表 题目1&#xff1a;30. 串联所有单词的子…

MyBatis学习笔记(周五前学完)

MyBatis-Plus是一个MyBatis的增强工具。在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 通过MyBatis-Plus来进行数据插入时&#xff0c;它默认会 使用雪花算法来生成id&#xff0c;长度比较长 增删改的返回值都是统一的&#xff0c;影响的只有行数。…

Matplotlib绘图指南:从基础绘图到多子图展示

目录 前言 导入模块 第一点&#xff1a;绘制图像 第二点&#xff1a;保存图像 第三点&#xff1a;多图形的绘制 第四点&#xff1a;绘制多子图 总结 前言 在数据可视化中&#xff0c;Matplotlib是一款强大的Python库&#xff0c;提供了丰富的功能来绘制各种类型的图表。…

Notepad++不显示CRLF的方法

View -> Show Symbol -> 去掉勾选 Show All Characters

[机缘参悟-191] - 《道家-水木然人间清醒1》读书笔记 -14- 关系界限 - 经济和人格上的独立,走向成熟的必经之路,才能更好的谈其他情感(IT)

目录 前言&#xff1a; 1、“友善的孤独者” 2、“外向的孤独者” 3、道不同不相为谋 4、警惕依赖 5、完整独立的个体 6、不必纠正他人的错误&#xff0c;除非他影响了你 7、不再期待别人能理解自己&#xff0c;只有高维向下兼容你的人才能理解你 8、只有高维和同频的…

有限元之有限元法的实现

目录 一、单元刚度矩阵及单元荷载 二、总刚度矩阵及总荷载的合成 三、边界条件处理 四、算例实现 4.1 C代码 4.2 计算结果 五、结论 前三节我们介绍了有限元的基本概念、变分理论及有限元空间的构造&#xff0c;本节我们探讨如何实现有限元法。我们继续以二维椭圆型方程…

5W 1.5KVDC、3KVDC 宽电压输入 DC/DC 电源模块——TP05DA 系列,广泛应用于通信、铁路等设备中

TP05DA系列电源模块额定输出功率为5W&#xff0c;外形尺寸为31.75*20.32*10.65&#xff0c;应用于2:1及4:1电压输入范围 9V-18V、18V-36V、36V-72V、9V-36V和18V-72VDC的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;具有输出短路保护等功能&#xff0c;可广泛应用于…