偶然看到国外论坛有人在吐槽同事从配置文件获取值的方式,因此查阅了相关资料发现确实有更便于管理更优雅的获取方式。
github demo地址: springboot-yml-value
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 复制代码
访问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中注册的属性类列表。
现在可以通过使用创建的@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()); } } 复制代码
测试结果如下:
欢迎移步github上手测试哦,地址在文首。本文原创,转载请附上原文链接,不然我会生气的。有帮助的话点个赞吧,笔芯。