基于springboot+enum配置化实践

前言

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两种形式,实现配置参数的注入,从而满足不同场景的使用需求。

在这里插入图片描述

好的,我会尝试帮您编写这部分代码。以下是一个简单的代码示例,供您参考: 后端代码(基于 Spring Boot): ```java @RestController public class AttendanceController { @Autowired private AttendanceService attendanceService; @PostMapping("/attendance") public void addAttendance(@RequestBody Attendance attendance) { attendanceService.addAttendance(attendance); } @GetMapping("/attendance") public List<Attendance> getAllAttendances() { return attendanceService.getAllAttendances(); } @GetMapping("/attendance/{id}") public Attendance getAttendanceById(@PathVariable("id") Long id) { return attendanceService.getAttendanceById(id); } @PutMapping("/attendance/{id}") public void updateAttendance(@PathVariable("id") Long id, @RequestBody Attendance attendance) { attendanceService.updateAttendance(id, attendance); } @DeleteMapping("/attendance/{id}") public void deleteAttendance(@PathVariable("id") Long id) { attendanceService.deleteAttendance(id); } } ``` ```java @Service public class AttendanceServiceImpl implements AttendanceService { @Autowired private AttendanceRepository attendanceRepository; @Override public void addAttendance(Attendance attendance) { attendanceRepository.save(attendance); } @Override public List<Attendance> getAllAttendances() { return attendanceRepository.findAll(); } @Override public Attendance getAttendanceById(Long id) { return attendanceRepository.findById(id).orElse(null); } @Override public void updateAttendance(Long id, Attendance attendance) { Attendance existingAttendance = attendanceRepository.findById(id).orElse(null); if(existingAttendance != null) { existingAttendance.setEmployeeId(attendance.getEmployeeId()); existingAttendance.setDate(attendance.getDate()); existingAttendance.setStatus(attendance.getStatus()); attendanceRepository.save(existingAttendance); } } @Override public void deleteAttendance(Long id) { attendanceRepository.deleteById(id); } } ``` ```java @Entity @Table(name = "attendance") public class Attendance { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long employeeId; private LocalDate date; private AttendanceStatus status; // getters and setters } ``` ```java public enum AttendanceStatus { PRESENT, ABSENT, LEAVE } ``` ```java public interface AttendanceRepository extends JpaRepository<Attendance, Long> { } ``` 前端代码(基于 Vue.js): ```html <template> <div> <h1>考勤管理</h1> <router-link to="/add-attendance">新增考勤</router-link> <table> <thead> <tr> <th>ID</th> <th>员工ID</th> <th>日期</th> <th>状态</th> <th>操作</th> </tr> </thead> <tbody> <tr v-for="(attendance, index) in attendances" :key="attendance.id"> <td>{{ attendance.id }}</td> <td>{{ attendance.employeeId }}</td> <td>{{ attendance.date }}</td> <td>{{ attendance.status }}</td> <td> <router-link :to="{ name: 'edit-attendance', params: { id: attendance.id } }">编辑</router-link> <button @click="deleteAttendance(index, attendance.id)">删除</button> </td> </tr> </tbody> </table> </div> </template> <script> import axios from 'axios' export default { name: 'AttendanceList', data() { return { attendances: [], } }, mounted() { this.loadAttendances() }, methods: { loadAttendances() { axios.get('/attendance') .then(response => { this.attendances = response.data }) }, deleteAttendance(index, id) { axios.delete(`/attendance/${id}`) .then(() => { this.attendances.splice(index, 1) }) }, }, } </script> ``` 希望这份代码能帮到您,如果有问题可以随时询问我。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值