注解使用
正文
一、Springboot中定义注解
1,定义注解类
/** * 自定义日志打印 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyLogger { String value() default ""; }
2,定义AOP切面
/** * 采用aop打印日志 */ @Component @Aspect @Slf4j public class MyLoggerAspect { /** * 其中@Pointcut声明了切点(这里的切点是我们自定义的注解类), * @Before声明了通知内容,在具体的通知中,我们通过@annotation(logger)拿到了自定义的注解对象, 所以就能够获取我们在使用注解时赋予的值了。 */ @Pointcut("@annotation(com.taiji.xhwcb.system.config.ann.MyLogger)") private void pointcut() { } @Before("pointcut() && @annotation(myLogger)") public void before(JoinPoint joinPoint, MyLogger myLogger) { //类名 String className = joinPoint.getSignature().getDeclaringType().getSimpleName(); //方法名 String methodName = joinPoint.getSignature().getName(); //获取所有的参数 Object[] args = joinPoint.getArgs(); StringBuffer sb = new StringBuffer(); sb.append("类名:").append(className).append(" - ").append("方法名:").append(methodName); for (int i = 0; i < args.length; i++) { sb.append(" - ").append("参数" + (i+1) + ":").append(args[i]); } //登陆用户 TaijiUser user = SecurityUtils.getUser(); if (!EmptyUtil.isEmpty(user)) { sb.append(" - ").append("用户为:").append(user.getId()).append("-").append(user.getUsername()); } log.info(sb.toString()); } }
3,在使用的方法上加上日志
@MyLogger @ApiOperation(value = "分页查询", notes = "分页查询") @GetMapping("/page" ) public R getPlayerConfigPage(Page page, PlayerConfig playerConfig) {}
4,打印效果
二、普通类中注解的使用
1,定义注解
//table表注解 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface TableRef { String value(); } //主键注解 @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Rowkey { } //普通字段注解 @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String family() default "info"; String column() default ""; }
2,使用注解
@Data @TableRef("ct:calllog") public class Calllog { @Rowkey private String rowkey; @Column(family = "caller") private String call1; @Column(family = "caller") private String call2; @Column(family = "caller") private String calltime; @Column(family = "caller") private String duration; @Column(family = "caller") private String flag = "1"; public Calllog() { } public Calllog(String data ) { String[] values = data.split("\t"); call1 = values[0]; call2 = values[1]; calltime = values[2]; duration = values[3]; } }
3,注解生效
protected void putData(Object obj) throws Exception { //反射 Class clazz = obj.getClass(); TableRef tableRef = (TableRef)clazz.getAnnotation(TableRef.class); String tableName = tableRef.value(); //获取所有的字段 Field[] fs = clazz.getDeclaredFields(); String stringRowkey = ""; for (Field f : fs) { Rowkey rowkey = f.getAnnotation(Rowkey.class); if ( rowkey != null ) { f.setAccessible(true); //获取属性值 stringRowkey = (String)f.get(obj); break; } } Connection conn = getConnection(); Table table = conn.getTable(TableName.valueOf(tableName)); Put put = new Put(Bytes.toBytes(stringRowkey)); for (Field f : fs) { Column column = f.getAnnotation(Column.class); if (column != null) { String family = column.family(); String colName = column.column(); if ( colName == null || "".equals(colName) ) { //获取属性名 colName = f.getName(); } f.setAccessible(true); //获取属性值 String value = (String)f.get(obj); put.addColumn(Bytes.toBytes(family), Bytes.toBytes(colName), Bytes.toBytes(value)); } } // 增加数据 table.put(put); // 关闭表 table.close(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话