在SpringBoot中,spring.factories
文件是一种特定的配置文件,用于向Spring容器中加载自定义的配置类或者自动配置组件。
什么是SpringBoot spring.factories文件
spring.factories
文件位于META-INF
目录下,它是SpringBoot用来实现自动配置的一个重要组件。该文件被用于对Spring加载的组件进行自动配置。
spring.factories
文件是一个key=value
键值对列表,其中key
指的是org.springframework.context.ApplicationContextInitializer
或org.springframework.boot.autoconfigure.EnableAutoConfiguration
,而value
则是对应的实现类列表。
Spring容器在启动时会扫描项目中的所有JAR包,当发现存在spring.factories
文件时,就会根据其中的key
来加载对应的组件。
SpringBoot spring.factories加载时机
Spring容器的启动过程中,SpringBoot会首先加载META-INF/spring.factories
配置文件。但是,如果在启动时没有发现该文件,则SpringBoot会重新加载该文件。
spring.factories
文件的加载顺序如下:
- 加载项目中所有依赖的JAR包中的
spring.factories
文件; - 将这些文件中的配置合并到一个集合中;
- 根据
org.springframework.core.annotation.Order
注解中的值对集合中的配置进行排序; - 将排序后的配置按
key
分组; - 将每个分组中的
value
按照顺序组合成一个新的集合并将它们注册到Spring容器中。
SpringBoot spring.factories示例分析
下面分别以ApplicationContextInitializer
和EnableAutoConfiguration
为例,来演示如何在spring.factories
中实现自定义配置。
示例1:自定义ApplicationContextInitializer
- 创建自定义的ApplicationContextInitializer实现类:
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("MyApplicationContextInitializer is running");
}
}
- 在
src/main/resources
目录下创建META-INF/spring.factories
文件,并在其中加入以下内容:
org.springframework.context.ApplicationContextInitializer=com.example.demo.MyApplicationContextInitializer
- 运行项目,在控制台中可以看到以下输出:
MyApplicationContextInitializer is running
说明自定义的ApplicationContextInitializer已经被Spring容器加载成功。
示例2:自定义EnableAutoConfiguration
- 创建自定义的自动配置类:
@Configuration
public class MyAutoConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
static class MyBean {
public void print() {
System.out.println("MyBean is running");
}
}
}
- 在
src/main/resources
目录下创建META-INF/spring.factories
文件,并在其中加入以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.MyAutoConfiguration
- 运行项目,并在
main
方法中获取MyBean并调用它的print()
方法:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
MyAutoConfiguration.MyBean myBean = context.getBean(MyAutoConfiguration.MyBean.class);
myBean.print();
}
}
- 在控制台中可以看到以下输出:
MyBean is running
说明自定义的自动配置类已经被Spring容器加载成功。
以上,就是SpringBoot spring.factories
加载时机分析的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot spring.factories加载时机分析 - Python技术站