如何基于SpringBoot实现自动装配返回属性
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍了如何基于SpringBoot实现自动装配返回属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:需求背景在业务开发
千家信息网最后更新 2025年11月07日如何基于SpringBoot实现自动装配返回属性
这篇文章主要介绍了如何基于SpringBoot实现自动装配返回属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
一:需求背景
在业务开发中经常会有这个一个场景,A(业务表)表中会记录数据的创建人,通常我们会用userId字段记录该数据的创建者,但数据的使用方会要求展示该数据的创建者姓名,故我们会关联用户表拿该用户的姓名。还有一些枚举值的含义也要展示给前端。导致原本一个单表的sql就要写成多表的关联sql,以及枚举含义的转换很是恶心。
例如:业务对象BusinessEntity.java
public class BusinessEntity { /** * 创建者id */ private Long createUserId; * 创建者名称 (需要关联用户表) private String userName; * 数据状态(0:有效,1失效) private String status; * 数据状态含义(需要解析0或1的含义给前端) private String statusName; * 数据集合 private List list;} 二:设计思路
就像@JsonFormat注解,可以指定返回日期格式。我们是不是可以也自定义一个注解,通过这个注解,我们可以自动的把需要联表的数据userName自动填充,需要解析的数据数据statusName如何通过枚举解析。
故定义枚举@AutowiredAttribute如下
/** * 自动装配属性 */@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})@Retention(RUNTIME)@Documentedpublic @interface AutowiredAttribute { /** * 当为默认值时,表明该属性为javaBean,且该javaBean需要自动注入属性 * 否则为指向的某一个属性 * * @return */ String param() default ""; * 默认为BaseEnum.class, * 当为默认时注入数据的来源时redis缓存, * 否则为枚举类型 Class extends BaseEnum> enumClass() default BaseEnum.class; * 数据源 DataSourceEnum dataSource() default DataSourceEnum.EMPTY;}定义公共枚举继承继承接口BaseEnum
public interface BaseEnum { String getCode(); String getMsg();}定义数据源枚举如下dataSource
public enum DataSourceEnum implements BaseEnum { SYSTEM_DICT("sys:dict:", "系统字典值", "sys_dict_value", "name"), USER_NAME("user:name:", "用户的id与姓名的映射", "sys_user", "user_name"), USER_ROLE("user:role:", "角色id于角色名称映射", "sys_role", "name"), DEPT_NAME("dept:name:", "部门的id与部门名称的映射", "sys_dept", "name"), EMPTY("00", "默认", "", ""); DataSourceEnum(String code, String msg, String tableName, String tableColumn) { this.code = code; this.msg = msg; this.tableName = tableName; this.tableColumn = tableColumn; } private String code; private String msg; /** * 表明 */ private String tableName; * 表的列 private String tableColumn; @Override public String getCode() { return code; public String getMsg() { return msg; public String getTableName() { return tableName; public String getTableColumn() { return tableColumn;}三:使用方法
对比原对象:通过新增注解,就避免的关联查询和数据解析
public class BusinessEntity { /** * 创建者id */ private Long createUserId; * 创建者名称 (需要关联用户表) @AutowiredAttribute(param = "createUserId", dataSource = DataSourceEnum.USER_NAME) private String userName; * 数据状态(0:有效,1失效) private String status; * 数据状态含义(需要解析0或1的含义给前端) @AutowiredAttribute(param = "status", enumClass = StatusEnum.class) private String statusName; * 数据集合 @AutowiredAttribute private List list;} 四:注解解析器(核心代码)
/** * 填充相应体 */@Component@ControllerAdvice()public class FillResponseBodyAdvice implements ResponseBodyAdvice { @Autowired RedissonClient redissonClient; JdbcTemplate jdbcTemplate; private static String GET_CODE_METHOD_NAME = "getCode"; private static String GET_MSG_METHOD_NAME = "getMsg"; @Override public boolean supports(MethodParameter returnType, Class converterType) { if (ResponseResult.class.getName().equals(returnType.getMethod().getReturnType().getName())) { return true; } return false; } public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (((ResponseResult>) body).getCode() == 200) {//仅仅对相应为200结果处理 Object data = ((ResponseResult>) body).getData(); Class> aClass = data.getClass(); if (data instanceof List) { //集合对象设置属性 setForListBeanArr((List) data); } else { //判断是否为自定义java对象 if (aClass.getSuperclass() instanceof Object) { setForJavaBeanArr(data, aClass); } } return body; /** * 为集合对象设置属性 * * @param list */ void setForListBeanArr(List实现了从数据库(mysql)自动查询,并把结果缓冲到数据库。
感谢你能够认真阅读完这篇文章,希望小编分享的"如何基于SpringBoot实现自动装配返回属性"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
数据
对象
属性
创建者
含义
注解
用户
关联
名称
状态
篇文章
装配
业务
前端
姓名
用户表
有效
数据库
数据源
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
http服务器调用资源
键盘记忆软件开发
网络安全的由学
黑龙江企业党建软件开发系统
冒险世界服务器
数据库连接一段时间自动断开
数据库置顶
服务器任务栏点不了了怎么办
网络安全威胁的隐蔽性
国富全球科技互联网
云数据库免费的吗
互联网医疗中的科技应用
反传销和网络安全教育过程
张湾区服务软件开发市场
蚂蚁金服软件开发服务商
网络安全进校园演讲
软件开发开展情况汇报
监督监察对象数据库
配置 服务器
信息网络安全专业硕士
屏幕共享软件开发哪家好
姑苏区好服务器生产商
小朋友网络安全宣传周
网络安全意识教育培训视频
科技互联网最新资讯
上海创新软件开发价格咨询
天津警官学院网络安全专业怎么样
2021年网络安全宣传日图片
数据库默认字符集怎么修改
偃师移动dns服务器地址