引入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默认的,不要自己进行声明管理了。。。
这个坑困扰了自己好长一段时间,还是自己的技术不到位导致的,继续加油吧!!!!!!!!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章