注解的基本语法
定义注解使用interface关键字来定义注解public interface AutoFill { }元注解元注解是用来注解其他注解的注解Java提供了以下几种元注解Target - 指定注解可以应用的目标元素类型Retention - 指定注解的保留策略Documented - 表示注解应该被包含在Javadoc中Inherited - 表示注解可以被继承Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface AutoFill { /** * 数据库操作类型INSERT、UPDATE */ OperationType value(); }示例代码展示了一个用于公共字段自动填充的自定义注解Target明确注解可在方法上使用Retention明确在程序运行时可见。注解元素注解中可以定义元素这些元素可以有默认值public enum OperationType { /** * 更新操作 */ UPDATE, /** * 插入操作 */ INSERT }示例自定义注解中的value方法则用来返回上示枚举类型数据明确 使用该注解的方法 的作用使用方式如下/** * 更新员工信息 * param employee */ AutoFill(OperationType.UPDATE) void updateById(Employee employee);当注解只有一个方法且方法名为 value 时使用时可以省略方法名如果方法不叫 value就必须明确指定方法名Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface AutoFill { /** * 数据库操作类型INSERT、UPDATE */ OperationType type(); }/** * 更新员工信息 * param employee */ AutoFill(type OperationType.UPDATE) void updateById(Employee employee);自定义注解的使用通过反射处理注解我们可以使用反射机制在运行时读取和处理注解Aspect Component Slf4j public class AutoFillAspect { /** * 公共字段自动填充切入点 */ Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill)) public void autoFillPointCut() {} /** * 公共字段自动填充 */ Before(autoFillPointCut()) public void autoFill(JoinPoint joinPoint) throws Throwable { log.info(公共字段自动填充通知开始); MethodSignature signature (MethodSignature)joinPoint.getSignature(); AutoFill autoFill signature.getMethod().getAnnotation(AutoFill.class); // 获取数据库操作类型 Enum operationType autoFill.value(); // 从ThreadLocal中获取当前登录用户的id Long currentId BaseContext.getCurrentId(); // 获取当前时间 LocalDateTime now LocalDateTime.now(); // 从joinPoint中获取参数 Object[] args joinPoint.getArgs(); if(argsnull || args.length0){ return; } // 从参数中获取实体对象 Object entity args[0]; // 调用实体对象的方法设置创建时间、创建人、更新时间、更新人 if(operationTypeOperationType.INSERT){ try{ Method setCreateTime entity.getClass().getDeclaredMethod(setCreateTime, LocalDateTime.class); Method setUpdateTime entity.getClass().getDeclaredMethod(setUpdateTime, LocalDateTime.class); Method setCreateUser entity.getClass().getDeclaredMethod(setCreateUser, Long.class); Method setUpdateUser entity.getClass().getDeclaredMethod(setUpdateUser, Long.class); setCreateTime.invoke(entity, now); setUpdateTime.invoke(entity, now); setCreateUser.invoke(entity, currentId); setUpdateUser.invoke(entity, currentId); }catch (Exception e){ log.error(公共字段自动填充通知异常, e); } }else if(operationTypeOperationType.UPDATE){ try{ Method setUpdateTime entity.getClass().getDeclaredMethod(setUpdateTime, LocalDateTime.class); Method setUpdateUser entity.getClass().getDeclaredMethod(setUpdateUser, Long.class); setUpdateTime.invoke(entity, now); setUpdateUser.invoke(entity, currentId); }catch (Exception e){ log.error(公共字段自动填充通知异常, e); } } }

相关新闻

6G网络中大模型技术与多模态感知通信的融合应用

6G网络中大模型技术与多模态感知通信的融合应用

1. 6G网络中的大模型技术演进在移动通信技术从5G向6G演进的过程中,人工智能与通信网络的深度融合正在重塑传统架构。作为这一融合的核心载体,大语言模型(LLM)技术凭借其强大的序列建模和跨模态理解能力,为6G网络带来了…

2026/7/1 2:26:59阅读更多 →
CAD 图纸批量处理:用 OpenClaw 实现图纸格式转换、批量打印、版本号自动标注

CAD 图纸批量处理:用 OpenClaw 实现图纸格式转换、批量打印、版本号自动标注

CAD 图纸批量处理的革命:利用 OpenClaw 实现高效自动化摘要: 在工程设计、建筑、制造等众多领域,计算机辅助设计(CAD)图纸是不可或缺的核心资料。随着项目规模的扩大和迭代频率的增加,处理大量 CAD 图纸所带…

2026/7/1 2:26:59阅读更多 →
Dify AI应用UI定制全攻略:从主题换肤到独立前端开发

Dify AI应用UI定制全攻略:从主题换肤到独立前端开发

如果你正在用 Dify 构建 AI 应用,是否曾有过这样的困惑:为什么我的应用界面看起来和别人的一模一样?当我想把 AI 能力嵌入到自己的产品、官网或内部系统时,那个标准的 Dify 聊天窗口,总显得格格不入。这恰恰是很多开发…

2026/7/1 3:22:07阅读更多 →
政企视频会议私有化:数据主权与合规审计的必答题

政企视频会议私有化:数据主权与合规审计的必答题

政企视频会议的真实痛点:数据主权失控与审计黑洞如何同时出现 一次看似常规的远程会议,可能成为政务、金融单位最隐秘的合规风险敞口。会议中讨论的未公开政策细节、内部敏感数据、甚至屏幕上共享的机密文件,如果经由公有云服务器中转或存储&…

2026/7/1 3:22:07阅读更多 →
Dify私有化部署UI深度定制指南:从主题色到自定义组件

Dify私有化部署UI深度定制指南:从主题色到自定义组件

这次我们来看一个对开发者、产品经理和AI应用构建者都非常实用的主题:如何个性化自定义Dify应用的UI界面。Dify作为一个开源的AI应用开发平台,其核心价值在于让用户无需编写复杂代码,就能通过可视化工作流快速构建和部署AI应用。然而&#xf…

2026/7/1 3:22:07阅读更多 →
AI视频生成实战:Codex与Remotion编程式视频制作全解析

AI视频生成实战:Codex与Remotion编程式视频制作全解析

最近在技术社区和视频创作圈里,Codex 这个名字被频繁提及,与之相关的 Remotion、HyperFrames 等技术也引发了大量讨论。很多朋友,尤其是从事视频剪辑、内容创作的朋友,都在问一个尖锐的问题: Codex 这类 AI 视频工具&…

2026/7/1 3:22:07阅读更多 →
AI应用开发实战:从RAG工程化到智能体工作流设计

AI应用开发实战:从RAG工程化到智能体工作流设计

如果你正在准备AI大模型应用开发岗位的面试,或者想从零开始构建一个能真正跑起来的智能体应用,那么这篇文章就是为你准备的。过去一年,我面试了超过50位候选人,也辅导了上百位开发者。一个最深刻的感受是:绝大多数面试…

2026/7/1 3:22:07阅读更多 →
从AI伯克希尔项目看多Agent协作框架的设计与实现

从AI伯克希尔项目看多Agent协作框架的设计与实现

最近在折腾 AI Agent 开发的朋友,可能都绕不开一个场景:如何让多个 AI 智能体(Agent)协作起来,去完成一个复杂的任务?比如,你想分析一家公司,是不是需要一个“研究员”Agent 去搜集财…

2026/7/1 3:17:06阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →