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

背景

在项目开发中,自定义了多个配置类,希望能够通过某种方式来控制加载顺序,于是使用了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默认的,不要自己进行声明管理了。。。
这个坑困扰了自己好长一段时间,还是自己的技术不到位导致的,继续加油吧!!!!!!!!!!!!!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值