代码编写时多重覆盖配置文件的方法
2019-09-28 本文已影响0人
不二不二熊
一、起源
很多时候,当我们在封装自己的框架的时候,一般都是会给使用者预留配置,这个时候配置文件就起作用了。一般而言我们在预留配置文件的时候都是采取三层覆盖的方式,即application配置文件覆盖实体类默认属性,用户配置覆盖application配置文件。
二、展示
- 第一种:application覆盖类属性
public enum LoginType {
/**
* 返回视图
*/
REDIRECT,
/**
* 返回json
*/
JSON;
LoginType() {
}
}
@ConfigurationProperties(prefix = "customer.setting")
@Data
public class SettingProperties {
/**
* 默认返回json
*/
private LoginType loginType = LoginType.JSON;
}
##用户自定义跳转方式
customer.setting.loginType=redirect
如上面所展示的,如果用户没有配置loginType
那么默认会使用json方式跳转,如果配置成了redirect
那么则会变为视图跳转,这是很常见的。
-
用户前端输入覆盖掉application配置
那么,另外还有一种方式,如果当用户在前台传入请求的时候已经带上了参数设置,那么该参数设置则会覆盖掉application配置。
@ConfigurationProperties(prefix = "com.imoc")
@Data
@Configuration
public class UserConfigition {
private MyUser user;
}
@Data
public class MyUser {
/**
* 用户自定义id
*/
private int id;
}
##自定义userid
com.imoc.user.id = 15
@RestController
@RequestMapping("/servlet")
public class ParmeatTest {
@Autowired
private UserConfigition userConfigition;
/**
* <一句话功能描述>:获取传入参数,如果没有的话则使用默认值
* <功能详细描述>:
* @Param:
* @Return: int
*/
@GetMapping("/parameterTest")
public int getUesrId(){
//从RequestContextHolder中获取request
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//从request中获取参数userId
int userId = ServletRequestUtils.getIntParameter(request, "userId", userConfigition.getUser().getId());
return userId;
}
当我们发起请求(http://localhost:8080/servlet/parameterTest?userId=27)
时,如果我们后面不带参数userId,那么返回的就是我们在配置文件时定义的值;如果我们携带了参数userId,那么我们userId的值就将变成27而非15,从而提高了可配置性。