SpringBoot中spring.factories文件的作用及读取过程

 更新时间:2025年11月19日 16:25:12   作者:码上淘金  
SpringBoot通过spring.factories文件实现自动配置和扩展机制,该文件位于类路径下的META-INF目录中,键是接口或抽象类的全限定名,值是实现类的全限定名列表,SpringFactoriesLoader类负责读取和解析spring.factories文件,获取指定工厂类型的实现类列表

在 Spring Boot 中,spring.factories 文件起着重要的作用,它是 Spring Boot 实现自动配置和扩展机制的关键部分。

下面详细介绍 spring.factories 文件是如何被读取的。

spring.factories文件的作用

spring.factories 文件位于类路径下的 META - INF 目录中,它是一个 properties 格式的文件,主要用于实现 Spring 的自动配置和扩展机制。

该文件的键通常是接口或抽象类的全限定名,值是实现这些接口或继承这些抽象类的具体类的全限定名列表,多个类名之间用逗号分隔。

读取过程

1. 触发读取的时机

在 Spring Boot 应用启动过程中,SpringApplication 类的 run 方法会调用一系列初始化和配置的逻辑,其中会触发对 spring.factories 文件的读取操作。

具体来说,当需要加载自动配置类、应用上下文初始化器、监听器等组件时,会从 spring.factories 文件中查找相应的实现类。

2. 使用SpringFactoriesLoader类读取文件

SpringFactoriesLoader 是 Spring 框架提供的一个工具类,专门用于从类路径下的 spring.factories 文件中加载工厂实现类。

以下是读取过程的详细步骤:

  • 获取类加载器SpringFactoriesLoader
  • 会使用当前线程的上下文类加载器或者指定的类加载器来查找 spring.factories 文件。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  • 查找所有 spring.factories 文件
  • 通过类加载器的 getResources 方法查找类路径下所有的 META - INF/spring.factories 文件。
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources("META - INF/spring.factories")
        : ClassLoader.getSystemResources("META - INF/spring.factories"));
  • 解析文件内容
  • 对于找到的每个 spring.factories 文件,将其内容解析为一个 Properties 对象。
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
  • 根据键获取值
  • 根据指定的工厂类型(键)从 Properties 对象中获取对应的实现类列表。
List<String> factoryImplementationNames = new ArrayList<>(Arrays.asList(
        StringUtils.commaDelimitedListToStringArray(properties.getProperty(factoryTypeName))));

3. 示例代码

以下是一个简化的示例,展示了如何使用 SpringFactoriesLoader 读取 spring.factories 文件中的自动配置类:

import org.springframework.core.io.support.SpringFactoriesLoader;

import java.util.List;

public class SpringFactoriesLoaderExample {
    public static void main(String[] args) {
        // 获取自动配置类列表
        List<String> autoConfigurationClasses = SpringFactoriesLoader.loadFactoryNames(
                org.springframework.boot.autoconfigure.EnableAutoConfiguration.class,
                Thread.currentThread().getContextClassLoader());

        // 打印自动配置类列表
        for (String className : autoConfigurationClasses) {
            System.out.println(className);
        }
    }
}

总结

Spring Boot 通过 SpringFactoriesLoader 类在应用启动时查找并读取类路径下所有的 spring.factories 文件,根据不同的工厂类型(键)加载对应的实现类,从而实现自动配置和扩展机制。

这种机制使得 Spring Boot 能够方便地集成各种第三方库和组件。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA搜索整个项目进行全局替换(有危险慎用)

    IntelliJ IDEA搜索整个项目进行全局替换(有危险慎用)

    今天小编就为大家分享一篇关于IntelliJ IDEA搜索整个项目进行全局替换(有危险慎用),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • java 正则,object中两个方法的使用(详解)

    java 正则,object中两个方法的使用(详解)

    下面小编就为大家带来一篇java 正则,object中两个方法的使用(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java eclipse 整个项目或包查找只定字符串并替换操作

    java eclipse 整个项目或包查找只定字符串并替换操作

    这篇文章主要介绍了java eclipse 整个项目或包查找只定字符串并替换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java通过IO流输出文件目录的实例代码

    Java通过IO流输出文件目录的实例代码

    这篇文章主要介绍了Java通过IO流输出文件目录,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • SpringBoot接口获取参数的常用注解详解

    SpringBoot接口获取参数的常用注解详解

    SpringBoot 接口获取参数的注解非常丰富,这篇文章主要为大家详细介绍了一些常用参数注解的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-01-01
  • SpringCloud大文件分片断点上传实现原理

    SpringCloud大文件分片断点上传实现原理

    这篇文章主要介绍了SpringCloud大文件分片断点上传实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    Java杂谈之类和对象 封装 构造方法以及代码块详解

    在现实世界中,真实存在的东西,比如吉普车,卡丁车,货车。我们在认识它的时候就会在脑海中将它抽象为一种类别叫做车。 好了,那再计算机世界中,它同样的也会这样做
    2021-09-09
  • Java判断一个时间是否在当前时间区间代码示例

    Java判断一个时间是否在当前时间区间代码示例

    这篇文章主要给大家介绍了关于使用Java判断一个时间是否在当前时间区间的相关资料,在日常开发中我们经常会涉及到时间的大小比较或者是判断某个时间是否在某个时间段内,需要的朋友可以参考下
    2023-07-07
  • 浅谈Java中Lock和Synchronized的区别

    浅谈Java中Lock和Synchronized的区别

    这篇文章主要介绍了Java中Lock和Synchronized的区别,Lock和Synchronized都是java中去用来解决线程安全问题的一个工具,但是具体有什么区别呢?下面我们一起进入文章了解具体详细内容吧,需要的朋友可以参考一下
    2022-04-04
  • Spring中统一异常处理示例详解

    Spring中统一异常处理示例详解

    这篇文章主要给大家介绍了关于Spring中统一异常处理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09

最新评论