spring.factories 文件用于在 Spring Boot 项目中配置自动配置项。它包含了一系列 key-value 对,key 是自动配置类的全限定名,value 是这些配置类对应的条件类。Spring Boot 会在启动时扫描 classpath 下的 META-INF/spring.factories 文件,并加载其中定义的自动配置类。这些自动配置类会在满足条件时自动生效,配置对应的 bean。举个例子,spring-boot-starter-web 中就有一个 spring.factories 文件,内容如下:
properties org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
这会在 classpath 中找到 spring-webmvc 时,自动配置 HttpEncodingAutoConfiguration、MultipartAutoConfiguration 和 WebMvcAutoConfiguration 这三个配置类。所以,spring.factories 文件的主要作用是:1. 定义自动配置类及其条件
2. Spring Boot 在启动时会加载 spring.factories 文件中的自动配置类
3. 当自动配置类的条件满足时,对应配置就会生效这使得 Spring Boot 可以根据 classpath 中的 jar 包自动配置相应的 bean,无需手动配置,大大提高了开发效率。理解 spring.factories 文件的作用,可以帮助你更好地利用 Spring Boot 的自动配置特性,编写自己的 starter
前景回顾:
我需要在A服务中引入一个B服务的功能(类似中间件),B服务打包,A服务maven导入之后,A启动成功在调用的时候 发现调用不到B服务的功能。
找到问题:
后来发现是因为B服务的功能包(路径)名和A服务的不一样,在A服务中的SpringBoot启动类也只是扫描了A服务的包路径,这样就导致B服务的功能无法生效
解决问题:
1、我们可以在扫描包后在新增一个具体的路径,这样下面的功能就能生效
2、我们可以用 @Import({XX.class}) 导入指定想要生效的功能
3、我们可以在B服务的resources下新建相应的配置spring.factories,将我们想要生效的功能,填写到里面
可以参考springframework配置,这样当我们引入这个包的时候就默认去获取spring.factories里面的配置信息,这样的好处我们就无需在启动类上手写相关配置,比较简便。需要注意的是这个属于全局的,一旦配置,你的服务子服务也会引入。可能会引入一些不需要的功能,还需要看自己的取舍