像专业人士一样阅读 Spring 属性
配置管理很重要☝️
随着云应用开发和微服务架构的普及,需要大量的集成和连接设置,因此以清晰、有条理的方式阅读配置的必要性正在迅速增长。
传统的配置读取方式有什么问题🤷
没什么。但是,当我们想在代码中注入大量此类配置时,情况就会变得复杂混乱。
我们来看一个包含单个属性文件和测试的示例。
application.properties ⚙️
demo.test.name=testName
demo.test.age=16
DemoApplicationTests.java
@SpringBootTest
class DemoApplicationTests {
@Value("${demo.test.name}")
private String name;
@Value("${demo.test.age}")
private Integer age;
@Test
void loadProperty() {
assertEquals("testName", name);
assertEquals(16, age);
}
}
现在,想象一下,如果我们有 5 个或 10 个这样的属性,那我们的代码就会变得杂乱无章,难以理解🥴
@ConfigurationProperties 来救场啦🤠
它允许我们将文件中的值注入application.properties到自定义类中。
@Component
@ConfigurationProperties(prefix = "demo.test")
@Setter
@Getter
public class DemoTestConfigs
{
private String name;
private Integer age;
}
- 该
@Component注解用于告诉 Spring 将此类作为 bean 进行管理,并提供注入功能。 - 这
@ConfigurationProperties就是魔法的奥秘所在。- 它会在类路径中的属性文件中查找并加载以“.”开头的属性。
demo.test
- 它会在类路径中的属性文件中查找并加载以“.”开头的属性。
- Lombok 的
@Setter作用是能够@ConfigurationProperties填充类中的值DemoTestConfigs。
然后我们就可以简单地将这个DemoTestConfigs豆子注入到我们的服务中了。🤝
我们来测试一下。
@SpringBootTest
public class ConfigurationPropertiesTest
{
@Autowired
private DemoTestConfigs demoTestConfigs;
@Test
public void loadPropertiesUsingConfigurationProperties(){
assertEquals("testName", demoTestConfigs.getName());
assertEquals(16, demoTestConfigs.getAge());
}
}
结论👇
我们已经看到,它如何@ConfigurationProperties帮助我们将类似的配置捆绑到一个组件类中,我们可以注入并使用该组件类,而不是逐个指定它们。