引入spring.factories给自己埋下的坑

本文分析了在Spring Boot项目中,自定义配置类与spring.factories文件导致的server.port配置失效问题。通过深入探讨@Configuration与@EnableConfigurationProperties注解的作用,指出了不当配置引发的加载顺序冲突,并给出了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

在项目开发中,自定义了多个配置类,希望能够通过某种方式来控制加载顺序,于是使用了spring.factories文件。

现象

引入spring.factories文件后,导致原本写在application.yml文件中的server.port不生效了。

分析

首先,看一下@Configuration注解的类

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@EnableConfigurationProperties({ ServerProperties.class, SfProperties.class })
public class SfHttpClientAutoConfiguration {
    // 此处省略部分代码
}

其中,ServerProperties.class是springboot里面的一个自动配置的类,请记住这个类。
SfProperties.class是自定义的类,代码如下:

@ConfigurationProperties(prefix = "server.sf", ignoreUnknownFields = true)
@Data
public class SfClientProperties {

	/**
	 * @fieldName: enabled
	 * @fieldType: boolean
	 * @Description: 开关标识,默认false
	 */
	private boolean enabled = false;
}

这个类有@ConfigurationProperties注解,想将配置文件中以"server.sf"开头的属性配置映射到这个类中,作为一个Bean交给Spring容器管理。但是仅仅有@ConfigurationProperties注解是不够的,需要@EnableConfigurationProperties注解。

EnableConfigurationProperties,在SpringBoot的注释中是这样说明的:为带有@ConfigurationProperties注解的Bean提供有效的支持。这个注解可以提供一种方便的方式来将带有@ConfigurationProperties注解的类注入为Spring容器的Bean。

所以,上述中会将ServerProperties和SfProperties两个类作为Bean交给Spring容器管理,并且里面属性的值会根据配置文件去映射。


接下来看一下spring.factories文件中的内容:

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.sf.steven.http.spring.boot.autoconfiguration.SfHttpClientAutoConfiguration

这里指定的自动配置类就是自定义的配置类,它会去读取bootstrap里配置项。


结束语

综合上述内容,最终会产生两个自定义的Bean:ServerProperties和SfProperties,SfProperties还好说,本身它里面的属性就是要放到bootstrap配置文件中去的,所以产生的Bean中属性都有值且正常的。
但是,ServerProperties原本是springboot自带的一个类,这里由于@EnableConfigurationProperties注解里value值的使用不当,导致ServerPropertiesBean里面的属性也只会与bootstrap里面的配置项进行映射,所以就出现了在application配置文件中配置了不起作用,但是在bootstrap配置文件中就可以读取到值现象。
最后,只需要将ServerProperties.class删除掉就可以了,让它成为springboot默认的,不要自己进行声明管理了。。。
这个坑困扰了自己好长一段时间,还是自己的技术不到位导致的,继续加油吧!!!!!!!!!!!!!

<think>嗯,用户问的是Spring.factories的使用场景。首先我得回想一下Spring框架的相关知识。Spring.factoriesSpring Boot中的一个机制,用于自动配置。可能用户在使用Spring Boot时遇到了需要扩展或自定义配置的情况,所以想知道什么时候该用这个文件。 首先,我应该解释Spring.factories的基本作用,它是如何被Spring Boot在启动时加载的,用来实现自动配置。然后需要列举几个典型的使用场景,比如自动配置类、自定义Starter、监听器、环境后处理器等。每个场景都需要具体说明,为什么在这些情况下需要使用Spring.factories,而不是其他方式。 另外,用户可能对如何创建自己的Starter或者扩展Spring Boot功能感兴趣,所以需要说明在这些情况下如何利用这个文件。还要注意提到第三方库集成的情况,比如当开发一个库需要自动配置时,Spring.factories是必要的。 需要确保回答结构清晰,分点说明,每个场景都有例子或解释。比如在自定义Starter时,必须通过Spring.factories注册自动配置类,这样应用引入依赖时才能自动生效。另外,监听器的注册也需要通过这个文件,否则Spring Boot不会自动识别。 可能还需要对比一下其他配置方式,比如@ComponentScan或者@Import,为什么在这些场景下Spring.factories更合适,比如当代码不在主应用的包路径下,或者需要更底层的控制时。 最后,总结一下使用Spring.factories的核心目的,即让Spring Boot在启动时发现并加载这些配置,实现自动化,减少手动配置。确保语言通俗易懂,避免太技术化的术语,但又要准确。</think>Spring Boot 的 `spring.factories` 文件是一个**底层扩展机制**,主要用于实现框架级的自动装配和扩展。它的核心使用场景如下: --- ### 1. **注册自动配置类** - **场景**:当需要让 Spring Boot 自动加载你的配置类时(例如开发自定义 Starter)。 - **原因**:Spring Boot 启动时会扫描 `META-INF/spring.factories` 中的 `org.springframework.boot.autoconfigure.EnableAutoConfiguration` 键值,加载对应的配置类。 - **示例**: ```properties # 在 spring.factories 中声明 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration ``` --- ### 2. **自定义 Starter 开发** - **场景**:开发可复用的 Spring Boot Starter(如公司内部的通用组件库)。 - **作用**:通过 `spring.factories` 暴露 Starter 的自动配置类,其他项目引入依赖后会自动生效。 - **示例**: ```properties # 自定义 Starter 的 spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.starter.MyStarterAutoConfig ``` --- ### 3. **扩展 Spring 监听器** - **场景**:注册自定义的 `ApplicationListener` 或 `SpringApplicationRunListener`。 - **原因**:监听 Spring Boot 生命周期事件(如应用启动、环境准备完成等)。 - **示例**: ```properties # 注册监听器 org.springframework.context.ApplicationListener=com.example.MyAppListener ``` --- ### 4. **自定义环境后处理器** - **场景**:在环境准备阶段修改配置(如动态调整 `Environment` 中的属性)。 - **方法**:实现 `EnvironmentPostProcessor` 并在 `spring.factories` 中声明。 - **示例**: ```properties # 注册环境后处理器 org.springframework.boot.env.EnvironmentPostProcessor=com.example.MyEnvPostProcessor ``` --- ### 5. **第三方库集成 Spring Boot** - **场景**:第三方库需要与 Spring Boot 自动集成(如数据库驱动、工具类库)。 - **作用**:通过 `spring.factories` 声明初始化逻辑,无需用户手动配置。 - **示例**: ```properties # 例如 MyBatis 的自动配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration ``` --- ### ❗ 关键注意事项 1. **文件路径固定**:必须放在 `src/main/resources/META-INF/spring.factories`。 2. **与 `@ComponentScan` 的区别**: - `@ComponentScan` 用于扫描当前项目的组件。 - `spring.factories` 用于**跨模块、跨依赖**的扩展(如 Starter 的自动配置)。 3. **Spring Boot 2.7+ 的替代方案**:新版支持 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`,但 `spring.factories` 仍兼容。 --- ### 总结 使用 `spring.factories` 的核心场景是: 1. **需要框架级别的自动装配**(如自定义 Starter)。 2. **扩展 Spring Boot 底层行为**(如监听器、环境处理器)。 3. **跨模块/依赖的集成**(第三方库无需用户手动配置)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值