前言
Springboot/Springcloud作为微服务开发的经典框架,我想任何一个developer不会排斥。同时,市场越来越多的业务开发均围绕Springboot/Springcloud而展开,也让它成为Java开发的“硬通货”
。
基于Spring,诸多低代码
的平台的活跃,进一步促进了微服务领域技术的蓬勃发展,也减少了每个developer抽象
的烦恼。正如spring宣传的口号:
Spring makes Java simple
Spring makes Java modern
Spring makes Java productive
Spring makes Java reactive
它让Java变的“简单、先进、富有成效而又灵活”
了。
今日,博主通过springboot+enum
实现自定义参数的初始化和应用。
一. 自定义参数并创建一个enum
在springboot project中,我们通常会get一个yml文件,一般名为:bootstrap.yml
。文件的大致内容是对当前service的定义和运行的描述,形如:
# Tomcat
server:
port: 8080
# Spring
spring:
application:
# 应用名称
name: myapp
该文件指定了当前service 的端口号和名称,当然还可以添加更多你认为重要的参数
。接下来,博主带这各位看看如何使用springboot+enum实现配置参数的获取和使用。
1. 自定义参数
首先定义一些参数,比如我们可以在bootstrap.yml
中,添加以下参数:
api:
url: https://testapi.com
key: 123
secret: 123456
2. 自定义enum
再来定义一个枚举类MyEnum
:
public class MyEnum {
public enum api {
// 定义一个枚举,默认提供实际值,下一步通过配置参数替换
token("token","https://testapi.com/api/token"),
;
private String code;
private String url;
//定义构造器
api(String code, String url){
this.code = code;
this.url = url;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
}
这里博主内置了一个token api
的完整URL,显然不便于未来的维护。完成以上准备后,我们看看下一步如何使用自定义参数来改造它。
二. 在enum或bean中使用参数
1. @Value简介
我们知道基于springboot,有多种参数的加载(load)方式。这里博主以@Value
为例进行说明。
@Value
注解可以用来将外部的值动态注入到 Bean 中,通常用于属性的注入。可以用在字段或者方法上,但是不能直接用于static或者final修饰的字段上。使用该方式时,必须满足spring依赖注入的要求,否则无法生效。
2. 创建Java bean并注入参数
通过在指定的属性上,添加@Value("${XXX}")
,实现参数注入。
@Component
@Data
public class ApiBean implements Serializable
{
private static final long serialVersionUID = 1L;
//key
@Value("${api.key}")
private String key;
//secret
@Value("${api.secret}")
private String secret;
}
提示
:该Bean必须添加@Component
注解,否则无效。
3. 修改enum类并注入参数
public class MyEnum {
//使用参数值
static String apiUrl = MyEnum.api.MyEnumInit.urlRoot;
public enum api {
// 替换为参数提供的值
token("token",apiUrl+"/api/token"),
;
private String code;
private String url;
//定义构造器
api(String code, String url){
this.code = code;
this.url = url;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
// 看这里,新增内部类,支持注入
@Component
static class MyEnumInit{
private static String urlRoot;
@Value("${api.url}")
public void getUrl(String url) {
MyEnumInit.urlRoot = url;
}
}
}
}
提示
:内部类必须添加@Component
注解,否则无效。
关键的实现是enum中内部类的定义:MyEnumInit
。通过内部类实现依赖注入,完成url配置参数的获取。这是“曲线救国”
的典型实践。
结语
本案例通过@Value
注解实现自定义参数的使用。通过Java bean和enum两种形式,实现配置参数的注入,从而满足不同场景的使用需求。