【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 加载过程
-
查找文件:
SpringFactoriesLoader
会遍历类路径中的所有 JAR 包,查找META-INF/spring.factories
文件。
-
解析文件:
- 对于每个找到的
spring.factories
文件,SpringFactoriesLoader
会解析文件内容,提取键值对。
- 对于每个找到的
-
加载类:
- 根据键值对,
SpringFactoriesLoader
会使用类加载器加载指定的类。
- 根据键值对,
-
实例化对象:
- 加载的类会被实例化,并注册到 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