偶然看到国外论坛有人在吐槽同事从配置文件获取值的方式,因此查阅了相关资料发现确实有更便于管理更优雅的获取方式。
github demo地址: springboot-yml-value
1.什么是yml文件
application.yml取代application.properties,用来配置数据可读性更强,尤其是当我们已经制定了很多的层次结构配置的时候。
下面是一个非常基本的yml文件:
server:
url: http://localhost
myapp:
name: MyApplication
threadCount: 4
...
复制代码
等同于以下的application.properties文件:
server.url=http://localhost
server.myapp.name=MyApplication
server.myapp.threadCount=4
...
复制代码
demo中的yml文件如下:
server:
url: http://myapp.org
app:
name: MyApplication
threadCount: 10
users:
- Jacob
- James
复制代码
2.yml属性获取配置
访问yml属性的一种方法是使用@Value("$ {property}")
注释,但是随着配置树形结构以及数量的增加,代码可读性也随之降低,更不利于bean的管理。笔者发现另一种优雅的方法可以确保强类型bean的管理以及更方便的验证我们的应用程序配置。
为了实现这一点,我们将创建一个@ConfigurationProperties
类ServerProperties,它映射一组相关的属性:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList;
import java.util.List;
/**
* @program: simple-demo
* @description: 映射属性 (server节点)
* @author: CaoTing
* @date: 2019/6/3
**/
@Data
@ConfigurationProperties("server")
public class ServerProperties {
private String url;
private final App app = new App();
public App getApp() {
return app;
}
public static class App {
private String name;
private String threadCount;
private List<String> users = new ArrayList<>();
// TODO getter and setter
}
}
复制代码
请注意,我们可以创建一个或多个@ConfigurationProperties类。
定义我们的springboot 注册配置类ApplicationConfig:
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @program: simple-demo
* @description: 注册所有映射属性类 { }中用逗号分隔即可注册多个属性类
* @author: CaoTing
* @date: 2019/6/3
**/
@Configuration
@EnableConfigurationProperties({ServerProperties.class})
public class ApplicationConfig {
}
复制代码
这里已经提到了要在@EnableConfigurationProperties中注册的属性类列表。
3.访问yml属性
现在可以通过使用创建的@ConfigurationProperties bean来访问yml属性。可以像任何常规的Spring bean一样注入这些属性bean,测试类如下:
import com.caotinging.ymldemo.application.YmlValueApplication;
import com.caotinging.ymldemo.config.ServerProperties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @program: simple-demo
* @description: 单元测试类
* @author: CaoTing
* @date: 2019/6/3
**/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = YmlValueApplication.class)
public class AppYmlValueTest {
@Autowired
private ServerProperties config;
@Test
public void printConfigs() {
System.out.println(this.config.getUrl());
System.out.println(this.config.getApp().getName());
System.out.println(this.config.getApp().getThreadCount());
System.out.println(this.config.getApp().getUsers());
}
}
复制代码
测试结果如下:
4.总结
欢迎移步github上手测试哦,地址在文首。本文原创,转载请附上原文链接,不然我会生气的。有帮助的话点个赞吧,笔芯。