Spring Boot 2.x 最佳实践之自定义Properties
Spring Boot 中自定义属性是一个非常有用的技术,可以用来完美替代
@Value
注解.
如果不使用这个技术,那么当我们想要使用properties 配置文件中的属性值的时候可能是这样配置的
@Value(value="${spring.application.environment-profile}")
private String currentEnvironmentProfile;
如果只需要获取单个属性值还好,但如果需要获取多个属性,那么维护起来就挺费劲的。
学会这个技术有什么用?
- 我们知道,在开发企业级应用软件的时候,往往避免不了需要根据自己业务做一些配置开关,以方便尽量在不修改代码的前提下,改变一些代码逻辑。
- 当然除了可以放到application.properties 里面,也可以将开关静态值中通过页面或者API操作动态修改或者最优的方式将开关放到数据库中进行动态修改。
- 学会之后,我们就可以像操作对象一样管理这些配置属性。
这篇博文我们就一起来学习下如何定义一个像Spring Boot 中其他框架一样使用的配置。
1.添加项目依赖
- 添加spring-boot-configuration-processor是自定义属性文件必须的
<!--自定义配置文件必须有此依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
如果不知道lombok ,请查看另外一篇博文Spring Boot 2.x 最佳实践之 lombok集成,装好lombok插件再来看这篇文章。
2. 为自定义配置属性自定义一个类
MyCustomProperties.java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 自定义属性
* @author qing-feng.zhao
* */
@Data
@ConfigurationProperties(prefix="com.xingyun.customize")
public class MyCustomProperties {
/**
* 对应的属性就是 com.xingyun.customize.server-address
*/
private String serverAddress;
/**
* 对应的属性就是 com.xingyun.customize.port
*/
private String port;
/**
* 对应属性就是 com.xingyun.customize.username
*/
private String username;
/**
* 对应属性就是 com.xingyun.customize.password
*/
private String password;
}
值得注意的是
- 这里的变量名称不可以有下划线 否则会出错
- 更多详情请看: @ConfigurationProperties(prefix =“xxx”)的值取出为空
3.创建一个文件夹config 激活自定义配置文件
在config 文件夹下新建CustomPropertiesConfig.java 类
import com.xingyun.springbootwithconfigurationprocessorsample.customize.properties.MyCustomProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @EnableConfigurationProperties 激活自定义属性扫描文件
* 多个自定义配置文件以逗号隔开配置
* @Configuration 注解表明是一个Spring 配置类
* @author qing-feng.zhao
* */
@EnableConfigurationProperties({
MyCustomProperties.class
})
@Configuration
public class CustomPropertiesConfig {
}
4.application-dev.properties 中使用它
application.properties
# config active which one profile,current active application-dev.properties
spring.profiles.active=dev
application-dev.properties
# 基础配置
# 配置当前应用程序的名称,选填 可不配置
spring.application.name=spring-boot-with-custom-properties
# 内嵌容器参数配置
# 配置应用程序的访问端口 选填 不配置默认是8080
server.port=8080
# 配置应用程序的IP,选填
server.address=127.0.0.1
# 配置应用程序的上下文
server.servlet.context-path=/
# Spring Boot 日志
# SpringBoot默认使用的的日志框架是slf4j + Logback
# Logback 没有 FATAL 级别,对应着 ERROR
# 日志级别从低到高
# TRACE < DEBUG < INFO < WARN < ERROR
## 默认配置INFO、WARN、ERROR级别的日志输出到控制台
logging.level.root=info
##配置自己的应用程序日志级别,com.xingyun 是自己应用程序的根包
logging.level.com.xingyun=debug
##设置其他全部的日志等级
logging.level.*=warn
# 自定义配置属性
com.xingyun.customize.server-address=192.168.1.1
com.xingyun.customize.port=5670
com.xingyun.customize.username=root
com.xingyun.customize.password=toor
5.新建一个Controller 测试使用
HomeController.java
import com.xingyun.springbootwithconfigurationprocessorsample.customize.properties.MyCustomProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author qing-feng.zhao
*/
@Slf4j
@RestController
public class HomeController {
/**
* Spring 今后推荐使用构造方法注入
*/
public final MyCustomProperties myCustomProperties;
public HomeController(MyCustomProperties myCustomProperties) {
this.myCustomProperties = myCustomProperties;
}
/**
* 拦截首页 / 请求
* @return
*/
@GetMapping(value = "/")
public String homePage(){
return "Hello World";
}
/**
* 测试自定义属性调用 值得注意的是只能实例方法调用,静态方法不可调用
* @return
*/
@GetMapping(value = "/test.do")
public String testCustomProperties(){
log.debug("自定义属性测试使用开始");
log.debug("server address:{}",myCustomProperties.getServerAddress());
log.debug("port:{}",myCustomProperties.getPort());
log.debug("username:{}",myCustomProperties.getUsername());
log.debug("password:{}",myCustomProperties.getPassword());
log.debug("自定义属性测试使用结束");
return "test success,please check log from console";
}
}
6.访问URL
访问请求 http://127.0.0.1:8080/test.do
打印结果如下:
7. 源码下载
spring-boot-with-configuration-processor-sample
8. 参考文献
@ConfigurationProperties绑定配置信息至Array、List、Map、Bean
本篇完~