springboot核心基础之spring.factories机制

SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持 阅读详情

引言

在java spring cloud项目中,我们常常会在子模块中创建公共方法,那么在另外一个子模块中,需要加载配置文件的时候,往往Spring Boot 自动扫描包的时候,只会扫描自己模块下的类。这个是springboot约定俗成的内容。

抛出问题

如果想要被Spring容器管理的Bean的路径不再Spring Boot 的包扫描路径下,怎么办呢?也就是如何去加载第三方的Bean 呢?

目前较通用的方式有2种,一是使用注解进行实例化,而是使用spring.factories机制。

这里我们使用Swagger的配置来做实验。

 首先一个Swagger的配置类:SwaggerConfig,工程结构如下:

springboot核心基础之spring.factories机制

发现我的SwaggerConfig 类和 SpringBoot 的启动类ConfigApplication.java 不在同一级目录下,按照springboot启动机制,以当Spring Boot 自动扫描包的时候,是扫描不到我的SwaggerConfig 的配置的,也就在控制台没有Swagger的打印的信息:

springboot核心基础之spring.factories机制

所以这时候我如果想要把SwaggerConfig 加载到Spring容器中的话 要怎么办呢?下面介绍上面提到的2种方式:

方法解决

方法一:在Spring Boot Application 主类上使用@Import注解。

springboot核心基础之spring.factories机制

关于@Import 注解有不懂的同学,建议自行学习。

方法二:创建spring.factories文件

现在我们将其改造一下,采用spring.factories 的方式去加载SwaggerConfig类,在resources目录下新建一个META-INF 的目录,然后在

新建一个spring.factories 的文件,里面的内容为:

springboot核心基础之spring.factories机制

然后在把Spring Boot 启动类上的@Import注释掉,启动发现也可以把SwaggerConfig加载到Spring 容器中:

springboot核心基础之spring.factories机制


到这就完成了加载一个Spring 不能扫描到的一个类,他可以是第三方的,也可以是自己写的,只要是Spring Boot 默认扫描路径不能够扫描到,都可以使用这种方式去加载。

内部原理机制

Spring.Factories这种机制实际上是仿照java中的SPI扩展机制实现的。

什么是SPI 机制

SPI 的全名为 Service Provider Interface.大多数开发人员可能不熟悉,因为这个是是针对厂商或者插件的。在java.util.ServiceLoader 的文档里有比较详细的介绍。

简单总结下Java SPI机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如 日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及了具体的实现类,就违反了可插拔的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。

Java SPI 就是提供这样的一种机制:为某个接口寻找服务的实现的机制,有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制很重要。

Spring Boot 中的SPI 机制

在Spring boot 中也有一种类似的加载机制,它在
META-INFO/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。

这种自定义的SPI 机制就是Spring Boot Starter 实现的基础。

Spring Factories实现原理

spring -core 包里定义了SpringFactoriesLoader 类,这个类实现了检索META-INF/spring.factories文件,并获取指定接口的配置的功能。在这个类中定义了两个对外的方法:

  • loadFactories 根据接口类获取其实现类的实例,这个方法返回的是对象列表
  • loadFactoryNames 根据接口获取其接口类的名称,这个方法返回的是类名的列表。

上面两个方法的关键都是从指定的ClassLoader中获取spring.factories文件,并解析得到类名列表,具体代码如下:

springboot核心基础之spring.factories机制

从代码中可以看到,在这个方法中会遍历整个ClassLoader 中所有Jar包下的spring.factories文件,也就是我们可以在自己jar中配置spring.factories文件,不会影响到其他地方的配置,也不回被别人的配置覆盖。

spring.factories的是通过Properties解析得到的,所以我们在写文件中的内容都是按照下面这种方式配置的。

springboot核心基础之spring.factories机制

如果一个接口希望配置多个实现类,可以用","分割。

spring-boot包中的spring.factories文件

在Spring Boot 的很多包中都能够找到spring.factories,下面就是spring-boot 包中的spring.factories文件。

# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader


# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener


# Error Reporters
org.springframework.boot.SpringBootExceptionReporter=\
org.springframework.boot.diagnostics.FailureAnalyzers


# Application Context Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer


# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.context.logging.LoggingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener


# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor


# Failure Analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer


# FailureAnalysisReporters
org.springframework.boot.diagnostics.FailureAnalysisReporter=\
org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter

在日常工作中,我们可能需要实现一些SDK 或者Sring boot starter 给别人用的时候,我们就可以使用Factories机制,Factories机制可以让SDK或者Stater的使用只需要很少或者不需要进行配置,只需要在服务中引入我们的Jar包就即可。

以上为全部内容。

一篇博客搞懂spring.factories的基本概念和使用 spring.factories 是,用于定义和加载 Spring Boot 自动配置类、监听器、环境后处理器等。它通常位于 META-INF 目录下。 阅读详情

相关推荐

Spring的Factories机制介绍

在看本节文章之前,建议大家先去了一下java的SPI机制,因为Spring的Factories就是Spring版本的Java Spi,我在关于java基础系列文章中有详细介绍Java SPI机制。 Spring Factories的最重要的功能就是:可以通过配置文件指定Spring容器加载一些特定的组件。 基本概念 什么是Spring Factories Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然

小明的博客 7519

spring.factories 文件配置详情

spring.factories 文件配置

旷野历程 4982

springboot - spring.factories

具体来说,当我们需要自定义 Spring Boot 应用程序的自动配置时,只需要创建一个标注有 @Configuration 注解的类,再在其中定义需要自动配置的 Bean,然后将该类的全限定名添加到 META-INF/spring.factories 文件中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 配置项中,就可以实现自动配置了。那就是这样的咯:需要的配置类与启动类不在同一包路径下。2、自定义自动配置类。

学无止境 1300

【Spring Boot自定义Starter核心技术】:深入解析spring.factories机制与最佳实践

掌握自定义 Starter 的 spring.factories 机制,轻松实现自动配置。本文深入解析其加载原理、适用场景与核心实现方法,提升开发效率,避免重复配置。详解SPI扩展与最佳实践,值得收藏。

BreakVein的博客 1031

不只是驱动:拆解AIC8800 WiFi模组在RK Android系统的完整启动链(从DTS到HAL)

本文深入解析了AIC8800 WiFi模组在RK Android系统中的完整启动链,从设备树(DTS)配置到HAL层适配,涵盖驱动移植、固件加载及用户空间服务协同等关键环节。通过详细的技术分析和调试技巧,帮助开发者解决RK平台与AIC8800模组的兼容性问题,优化WiFi子系统性能。

weixin_30439067的博客 492

差分运放实战:如何快速计算带直流偏置的电路(附详细推导步骤)

本文详细解析了差分运放电路在带直流偏置设计中的核心计算方法和实战技巧。通过可视化参数关系和分步拆解,帮助工程师快速掌握电路设计精髓,包括虚短虚断原理、偏置电压计算及非理想因素处理,提升信号调理和传感器接口设计的效率与精度。

o4p5q6r7s的博客 413

spring.factories详解

spring.factories是Spring Boot基于SPI机制的扩展配置文件,用于实现自动化配置和模块化扩展。其核心功能包括加载自动配置类、扩展框架功能和解耦模块化开发。文件位于META-INF目录下,Spring Boot启动时通过SpringFactoriesLoader扫描并反射实例化配置类,支持条件注解和优先级控制。常见配置项包括自动配置类、环境后处理器和应用监听器等。实际应用场景包括开发自定义Starter、动态加载第三方库配置和多环境适配。通过定义属性配置类、服务逻辑和自动配置类,并注册

技术人集结地 3262

立创开源4G+GPS定位系统:基于微信小程序的低成本低功耗追踪方案

本文介绍了一个基于立创开源平台的超小型4G+GPS定位系统方案。该方案采用28mm*28mm主板,集成4G Cat.1通信与GPS定位,通过微信小程序“点灯专家”实现远程追踪管理,具备低成本、低功耗、易于部署的特点,适用于电动车、宠物、资产追踪等多种场景。

weixin_28895791的博客 396

Springboot2 自动装配之spring-autoconfigure-metadata.properties和spring.factories(SPI机制核心)

SpringBoot启动源码分析

万物皆字节 2万+

STM32F407步进电机控制及DM542驱动器使用

基于DM542驱动器的步进电机简单控制

qq_43868701的博客 1万+

AEB(自动紧急制动)

AEB系统对静止物体的误判率受多种因素影响,包括传感器精度、算法复杂性以及环境条件等。通过多传感器融合、算法优化、硬件升级以及环境适应性增强等技术手段,可以有效减少误判问题。美国和欧洲的AEB法规均强调了技术性能和安全性,但具体要求有所不同。美国的NHTSA规定更注重高速和复杂场景下的紧急制动能力,而欧盟的ECE R152法规则更侧重于基础的AEB功能覆盖范围。

百态·数智思维 | 聚焦大数据、量化与未来AI 2552

Spring Boot spring.factories文件详细说明

spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boot 自动配置模块的 META-INF 目录下,用于声明该模块提供的自动配置类、条件性配置类、环境后处理器等。以下是对 spring.factories 文件的详细说明:相信大家的项目中都会写starter,我们团队写的国际化通用和通用聚合服务等即插即用的功能包,就是用的starter。

m0_74825360的博客 768

从Google到LLVM:5种主流clang-format预设风格横向对比(含代码对比图)

本文横向对比了LLVM、Google、Chromium、Mozilla和WebKit五种主流的clang-format预设代码风格。通过同一段C++代码的格式化效果对比图,直观展示了它们在指针对齐、大括号换行、缩进等关键细节上的差异,并提供了基于团队背景与项目基因的选型决策指南。

weixin_28828243的博客 445

深入理解 SpringBoot 核心:自动配置原理、ImportSelector与配置加载机制

本文深入剖析SpringBoot自动配置的核心原理,详解ImportSelector如何实现动态配置加载,并通过代码示例对比Spring IoC容器的三种配置加载方式(直接指定、@Import模块化、@ComponentScan扫描)。带你彻底理解SpringBoot“开箱即用”背后的设计哲学与实现机制,掌握SpringBoot如何根据依赖智能推断并配置Bean,以及Starter依赖如何通过条件注解和清单文件实现零配置集成。

南部余额的博客 2190

SI好文翻译:铜箔表面纹理对损耗的影响:一个有效的模型(一)

Paul G. Huray发表在DesignCon2010的提出铜箔表面雪球模型的论文。第一部分说明之前的铜箔表面模型只适用于5GHz以内,超过5GHz后就不再准确。

小孟同学的博客 2176

SAP PFCG 中的单一角色与复合角色

在 SAP 系统的安全与授权管理中,事务码 PFCG(角色维护)扮演着关键角色。理解单一角色(Single Role)和复合角色(Composite Role)的概念,对于有效地管理用户权限至关重要。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1481

【SpringBoot】深入浅出 SpringBoot 自动装配

本文深入解析了SpringBoot自动装配机制的发展历程与实现原理。文章首先回顾了传统Spring框架的配置痛点,包括XML配置臃肿、注解配置零散等问题。随后重点剖析了SpringBoot2.x的自动装配机制,详细讲解了从@SpringBootApplication注解触发、AutoConfigurationImportSelector执行到条件筛选的完整流程,并解释了spring.factories文件的作用范围。最后介绍了SpringBoot3.x改用AutoConfiguration.imports文

27届Java后端炒粉练习生,AICoding中........ 1941

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SpringBoot组件加载的边界与桥梁:从默认扫描到spring.factories与@Import的进阶实践

本文深入探讨了SpringBoot组件加载的边界与桥梁机制,从默认包扫描的局限性出发,详细解析了@ComponentScan、@Import和spring.factories三种进阶实践方法。通过实战案例和原理剖析,帮助开发者解决多模块项目中的Bean加载问题,提升SpringBoot应用的灵活性和可维护性。

weixin_42522964的博客 387

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

一文搞懂Java、Spring、SpringBoot SPI机制

/ 支付业务统一接口// 统一下单支付方法接口定义,实现分离,配置驱动,自动加载。Java原生SPI基础垫底,缺点多,业务基本不用。Spring SPI做了优化,适配Spring容器,旧版SpringBoot在用。现在开发直接学SpringBoot新版SPI,适配最新版本,做自动配置、自定义Starter必备。解耦代码,不用改核心逻辑,就能无限扩展功能。

苍煜 438

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

面试官:SpringBoot Starter 为什么一引入就能用?

一篇文章带你深入解析 SpringBoot 自动装配原理

Tjy2186987211的博客 795

03SpringBoot原理分析

SpringBoot原理分析_起步依赖、自动配置、核心注解

m0_51697147的博客 1864
上一篇: Java后端技术栈,到底如何深入学习?
下一篇: Java关键字:final,static,this,super
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值