SpringBoot 这两个配置文件有什么区别?

news2024/12/29 10:55:39

本文讲解了关于 SpringBoot 自动装配的两个配置文件spring.factories 和 spring-autoconfigure-metadata.properties有什么区别?

点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达

读过上一片文章你可能会发现,在自动装配相关源码阅读的过程中涉及到了两个配置文件 spring.factoriesspring-autoconfigure-metadata.properties,如果查看过内容,你会觉得他们非常相似。

那么 spring.factories 和 spring-autoconfigure-metadata.properties有什么区别呢?

SpringBoot 自动装配原理,一文掌握!|原创

2022-12-27

56df01ec944bf0fc71d02c6c856b6f22.jpeg

spring.factories

“约定大于配置”在 Springboot 是一个很重要的思想,有一个约定就是 SpringBoot 启动的时候会加载 META-INF/spring.factories 配置文件。在 spring.factories 文件中,配置都是按照 Key-Value 形式保存的,Key 是需要解析类的全路径名,Value 是一个或多个类的全路径名,用逗号分隔,并且 spring.factories 文件可能有多个。Spring Boot 自动装配解析的核心配置文件就是它。

以 Feign 举例:

# spring.factories 文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration,\
org.springframework.cloud.openfeign.FeignAutoConfiguration,\
org.springframework.cloud.openfeign.encoding.FeignAcceptGzipEncodingAutoConfiguration,\
org.springframework.cloud.openfeign.encoding.FeignContentGzipEncodingAutoConfiguration

spring-autoconfigure-metadata.properties

spring.factories 和 spring-autoconfigure-metadata.properties 类似,都是位于 META-INF 目录下的文件,并且都是 Key-Value 形式保存数据。不同的是 ,后者的 Key 的格式为 类的全路径名.自动装配条件,Value 为 类的全路径名,使用逗号分隔。它管理的是 Bean 的装配条件。

假设有两个类需要自动装配,但是有装配的顺序要求,这就无法仅仅依靠 spring.factories 来实现,于是有了 spring-autoconfigure-metadata.properties,他的 Key 后面追加名字就代表了对应的装配条件。

以 Feign 的配置文件举例:

org.springframework.cloud.openfeign.encoding.FeignAcceptGzipEncodingAutoConfiguration.AutoConfigureAfter=org.springframework.cloud.openfeign.FeignAutoConfiguration

上面这段配置就代表 FeignAcceptGzipEncodingAutoConfiguration 必须在 FeignAutoConfiguration 装配之后再装配。

如何生成 spring-autoconfigure-metadata.properties

如果你阅读过源码,可能会发现源码文件中并没有找到 spring-autoconfigure-metadata.properties 文件,但是编译好的包中却有,这是怎么一回事呢?

因为它是自动生成的!

对于类路径上的每个自动配置类,Spring Boot 必须计算 @ConditionalXXX 条件值,用于决定是否加载自动配置及其所需的所有类,根据 Spring 启动应用程序中 starter 的数量,这可能会花费很多时间,为了提升启动时间,我们需要在 pom.xml 中添加一个依赖:

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-autoconfigure-processor</artifactId> 
    <optional>true</optional>  
</dependency>

这样它会解析各种 condition,生成 spring-autoconfigure-metadata.properties 文件。这样,Spring Boot 在启动期间读取这些元数据,可以过滤出不满足条件的配置,而不必实际检查这些类,提升启动速度。

总结

  • spring.factories :用于配置哪些 Bean 进行自动装配。

  • spring-autoconfigure-metadata.properties :控制 Bean 装配的条件信息,自动生成。

如果对你有帮助,欢迎点赞、评论或分享,感谢阅读!

精通MyBatis原理,看这两篇就够了!|原创

2022-12-25

b2df3c485b44f754e38c261b981690da.jpeg

大厂程序员常用的几款「高效工具」,已整理资源!

2022-12-20

1b1f2e4e731755b31f4799a2e398aa80.jpeg

MySQL主从复制太慢,怎么办?

2022-12-15

f67cfd1a5f7e640f941c2fb81036024e.jpeg

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

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

相关文章

第二个脚本——自动登录学习通

目录 本篇主要内容&#xff1a; 详细步骤&#xff1a; 第一步&#xff1a;对登入页面进行分析 第二步&#xff1a;模拟点击&#xff0c;表单填写和多边框操作原理介绍 模拟点击 表单填写 操作多选框: 第三步&#xff0c;实现自动登录 完整代码&#xff1a; 本篇主要内…

日百万流量网站励志一生被K

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 曾经每天小百万IP的网站、Z-blog流量最大的网址之一&#xff0c;励志一生这两周被百度K了&#xff0c;流量瞬间没有了&#xff0c;联盟广告收入估计日落千丈。这个网站有多牛可能很多人不清楚&#…

Linux内存管理:NUMA技术详解(非一致内存访问架构)

一.背景 所谓物理内存&#xff0c;就是安装在机器上的&#xff0c;实打实的内存设备&#xff08;不包括硬件cache&#xff09;&#xff0c;被CPU通过总线访问。在多核系统中&#xff0c;如果物理内存对所有CPU来说没有区别&#xff0c;每个CPU访问内存的方式也一样&#xff0c…

基于springboot+jpa 实现多租户动态切换多数据源 - 使用Flyway实现多数据源数据库脚本管理和迭代更新

多租户动态多数据源系列 1、基于springbootjpa 实现多租户动态切换多数据源 - 数据隔离方案选择分库还是分表 2、基于springbootjpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源 3、基于springbootjpa 实现多租户动态切换多数据源 - 使用Fl…

Kafka Producer Acks机制

Kafka Producer Acks 设置ACK props.put("acks", "all");通过上述代码&#xff0c;配置kafka生产者发送消息后&#xff0c;是否等待Broker的回执信息。在集群环境下&#xff0c;该配置是kafka保证数据不丢的重要的参数之一&#xff0c;今天来学习一下&…

深入理解Elasticsearch分片

了解分片的基本原理&#xff0c;对Elasticsearch性能调优有帮助。 关系梳理 ES底层使用的是Lucene库&#xff0c;ES的分片&#xff08;shard &#xff09;是Lucene的索引&#xff0c;ES的索引是分片的集合&#xff0c;Lucene的索引是由多个段&#xff08;segment&#xff09;…

青岛OJ如何导入题库详细图示

打开你的后台管理 找到问题位置 增加题目是可以编辑题目&#xff0c;导入数据。 导入导出是用题目和数据直接导入的。 这个ID的话就是题目ID不能设置一样的 然后题目输入输出就都不说了 按照格式就可以了&#xff0c;这里说一下Tag是标签&#xff0c;每次都要设置&#xff…

shell-条件测试

1、编写一个 Shell脚本&#xff0c;程序执行时从键盘读入一个目录名&#xff0c;如果用户输入的目录不存在&#xff0c;则提示file does not exist&#xff1b;如果用户输入的不是目录则提示用户必须输入目录名&#xff1b;如果用户输入的是目录则显示这个目录下所有文件的信息…

小程序版 Three.js 框架下载及目录配置

1.库文件说明 由于微信官方提供的threejs适配库已经很久没有更新&#xff0c;而且开发者普遍反映使用起来很难用。 我这里分享的是独立的库文件&#xff0c;不需要npm安装&#xff0c;下载后将库文件放到项目中即可使用。 2.下载后的压缩包文件 3.解压后的文件夹结构 4.文件…

Vue2和Vue3的双向数据绑定原理

目录前言&#xff1a;vue2.x 是如何实现响应式系统的&#xff1a;defineProperty 的痛点&#xff1a;Object.defineProperty 代码的使用Proxy 方法的理解Proxy 代码的使用&#xff1a;总结&#xff1a;前言&#xff1a; 今天小编给大家讲解一下&#xff0c;Vue2和Vue3的双向数据…

CAPL学习之路-测试功能集函数(诊断测试)

TestCollectDiagEcuInformation 向诊断目标的诊断类下的所有诊断服务发送诊断请求,并将诊断响应写入测试报告中 testcase TCExample() {int status;status = TestCollectDiagEcuInformation( "Door", "Sessions");if( status == 0)TestStepPass( "EC…

javaweb项目接入CAS单点认证(含自身系统的三员过滤)

一、搭建cas server 1.下载war包 2.打开cmd窗口执行以下命令&#xff0c;命令如下(指定ip)&#xff1a; keytool -genkey -v -alias casbm -keyalg RSA -keystore D:\cas\keystore\casbm.keystore -ext SANIP:192.168.2.166 3.我们生成秘钥库后需要从秘钥库中导出证书&#x…

D. Distinct Characters Queries(set维护)

Problem - 1234D - Codeforces 给你一个由小写拉丁字母组成的字符串s和对这个字符串的q个查询。 回顾一下&#xff0c;字符串s的子串s[l;r]就是字符串slsl1...sr。例如&#xff0c;"codeforces "的子串是 "code"、"force"、"f"、&quo…

spring6(概念;ioc详解,各种数据的注入方式)

第一章 启示录 一个普通的三层架构&#xff0c;不借助spring的情况下。需要程序员自己去new对象。 如果使用这种方式&#xff0c;那么代码上就把功能写死了&#xff0c;这时候需要更改一个数据库连接。这是时候数据交互层的代码就需要修改。这违背了OCP开闭原则。 1.1 OCP开闭…

Bert 得到中文词向量

通过bert中文预训练模型得到中文词向量和句向量&#xff0c;步骤如下&#xff1a; 下载 bert-base-chiese模型 只需下载以下三个文件&#xff0c;然后放到bert-base-chinese命名的文件夹中 得到中文词向量的代码如下 import torch from transformers import BertTokenizer,…

can8.0-基础知识

1、canopen协议概述 1.1对象字典 CANopen 协议采用了带有 16 位索引和 8 位子索引的对象字典,对象字典的结构如表 1.2 常用的通信对象 1) 网络管理对象 (NMT) 2) 服务数据对象 (SDO) 3) 过程数据对象 (PDO) 4) 同步对象 (SYNC) 5) 紧急报文 (EMCY) 1.3 通信对象…

PISR 数据库,区块链和大数据的下一个最佳结合

据集合。如今&#xff0c;在大数据时代&#xff0c;数据管理越来越受到重视&#xff0c;已经成为一项非常重要的资产。因此&#xff0c;数据安全也变得越来越重要&#xff0c;应该引起重视。尽管现有数据库可以满足单个公司的存储依赖性&#xff0c;但它们很难确保公司之间协作…

React学习03-基于脚手架的React应用

初始化脚手架 使用 npx 创建 npx create-react-app 项目名使用 npm install 创建 全局安装create-react-app包&#xff1a; npm install -g create-react-app创建脚手架&#xff1a; create-react-app 项目名npm 镜像 执行 create-react-app时&#xff0c;还会自动安装一…

C++程序员学习资料汇总

小白入门 计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09; 非常适合小白学习&#xff0c;没有废话&#xff0c;非常生动 《计算机是怎样跑起来的》 《程序是怎样跑起来的》 《网络是怎样连接的》 基础 资料名备注状态阅读时间《深入理解计算机系统》很多大厂面…

实验室预约系统|基于Springboot+Vue实现学校实验室预约管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…