当前位置: 首页 > news >正文

【Spring知识】Spring Starter内核spring.factories的工作机制

文章目录

      • 1. 文件位置
      • 2. 文件内容
      • 3. 加载机制
        • 3.1 `SpringFactoriesLoader`
        • 3.2 加载过程
      • 4. 自动配置
        • 4.1 `@EnableAutoConfiguration` 注解
        • 4.2 `SpringApplication` 类
      • 5. 自定义自动配置
        • 5.1 创建自动配置类
        • 5.2 添加到 `spring.factories`
      • 总结
    • 相关文献

spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它用于指定哪些类应该在应用程序启动时被自动配置。下面详细介绍 spring.factories 文件的底层工作原理。

1. 文件位置

spring.factories 文件位于 JAR 包的 META-INF 目录下,具体的路径是 META-INF/spring.factories。这个文件是一个普通的文本文件,格式类似于 Java 属性文件。

2. 文件内容

spring.factories 文件的内容是一个键值对列表,其中键是接口或注解的全限定名,值是实现了这些接口或注解的类的全限定名。最常见的键是 org.springframework.boot.autoconfigure.EnableAutoConfiguration,它指定了哪些自动配置类应该被加载。

例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

3. 加载机制

3.1 SpringFactoriesLoader

Spring Boot 使用 SpringFactoriesLoader 类来加载 spring.factories 文件中定义的类。SpringFactoriesLoader 是一个工具类,负责从类路径中查找并加载所有 META-INF/spring.factories 文件。

3.2 加载过程
  1. 查找文件

    • SpringFactoriesLoader 会遍历类路径中的所有 JAR 包,查找 META-INF/spring.factories 文件。
  2. 解析文件

    • 对于每个找到的 spring.factories 文件,SpringFactoriesLoader 会解析文件内容,提取键值对。
  3. 加载类

    • 根据键值对,SpringFactoriesLoader 会使用类加载器加载指定的类。
  4. 实例化对象

    • 加载的类会被实例化,并注册到 Spring 容器中。

4. 自动配置

4.1 @EnableAutoConfiguration 注解

在 Spring Boot 应用程序的主类上,通常会有一个 @SpringBootApplication 注解,这个注解实际上是一个组合注解,其中包括了 @EnableAutoConfiguration 注解。

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
4.2 SpringApplication

SpringApplication 类在启动时会调用 SpringFactoriesLoader 来加载所有配置了 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键的类。

public class SpringApplication {// 其他代码...private void loadAutoConfigurationClasses() {Set<String> autoConfigurationClasses = getAutoConfigurationClasses();if (!autoConfigurationClasses.isEmpty()) {this.context.addInitializers((ApplicationContext context) -> {AutoConfigurationImportSelector selector = new AutoConfigurationImportSelector();String[] configurations = selector.selectImports(autoConfigurationClasses.toArray(new String[0]));context.registerBean(AutoConfigurationImportSelector.class, () -> selector);context.registerBeans(configurations);});}}private Set<String> getAutoConfigurationClasses() {return SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, getClassLoader());}
}

5. 自定义自动配置

你也可以创建自己的自动配置模块,并通过 spring.factories 文件将其注册到 Spring Boot 中。

5.1 创建自动配置类
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class MyDataSourceAutoConfiguration {@Beanpublic DataSource dataSource() {// 创建并返回 DataSource 实例return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript("schema.sql").build();}
}
5.2 添加到 spring.factories

在你的模块的 META-INF/spring.factories 文件中添加如下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.MyDataSourceAutoConfiguration

总结

spring.factories 文件是 Spring Boot 自动配置机制的重要组成部分。通过这个文件,Spring Boot 可以在启动时自动加载和配置一系列预定义的类,从而简化了应用程序的初始化过程。希望这个详细的解释能帮助你更好地理解 spring.factories 的工作原理。如果有任何问题或需要进一步的帮助,请随时提问!

相关文献

【spring相关技术】springboot进阶-从0开始创建一个starter


http://www.mrgr.cn/news/60130.html

相关文章:

  • Mybatis的关联关系-多对多
  • Pandas库学习Day21
  • SpringCloud Gateway路由核心原理解析
  • # 渗透测试#安全见闻9 二进制安全
  • 通过企业架构蓝图(EA Blueprint)构建企业数字化转型之路
  • 计算机网络原理总结C-网络层
  • [专有网络VPC]ECS安全组配置案例
  • 单纯形线性规划
  • 合合信息智能文档处理百宝箱:强力驱动,加速文档类应用研发进程
  • 开源自动化测试工具Playwright
  • C#与C++交互开发系列(十四):C++中STL容器与C#集合传递的形式
  • python函数-18
  • 在linux系统中使用zlib库 压缩解压 文件(C++)
  • redis缓存击穿如何解决和预防?
  • H3C Hybrid 实验
  • 深入浅出 C++ STL:解锁高效编程的秘密武器
  • C/C++小宇宙代码
  • 道路车辆功能安全 ISO 26262标准(9-4)—面向汽车安全完整性等级 (ASIL) 和安全的分析
  • 清华面试文稿
  • 平衡控制——直立环——速度环
  • 基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战
  • android studio编译错误提示无法下载仓库
  • stm32单片机基于rt-thread 的 littlefs 文件系统 的使用
  • 梦笔记20241028
  • AngularJS 指令
  • python处理文件和图片