前言

我们在做开发springboot 项目时候会遇到各种各样注解,使用各种各样注解,极大的简便了我们开发流程,方式,从JDK5开始支持 注解是Java语言的一种强大的功能

可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取、执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息

自定义注解

  1. 注解的定义修饰符为@interface
  2. 注解中可以添加成员变量,成员变量以方法的形式定义
  3. 需要使用@Retention注解来规定它的生命周期(编译期间、运行时等)
  4. 需要使用@Target注解来规定它的适用范围(类型、方法、字段、方法参数等)
package cn.soboys.kmall.common.annotation;

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER ,ElementType.TYPE,ElementType.FIELD})
@Documented
@Inherited
public @interface SysLog { String value() default "";
String message();
String[] names() default {};
}
  1. @Inherited注解规定了这个自定义注解是可以被继承的
  2. 注解定义中 String value() 通过方法的方式定义了注解的成员变量value默认key 通过default定义默认值
  3. 注解定义中 String message(); String[] names(); 通过方法的方式定义了注解的成员变量message和names,其中names为String数组

支持参数有

  1. 基本类型:byte, short, char, int, long, float, double
  2. String
  3. Class
  4. enum
  5. Annotation

在具体使用的时候 通过反射找到添加该注解的类、方法或属性,然后根据注解中的字段取值判断该类或方法是否符合标准 然后在处理自己的相关业务逻辑

实列使用场景

一般结合Aop来使用 这里通过后台日志记录作为使用场景 这里关于aop 使用请参考我前面的文章写的和详细

  1. 定义自定义注解 SysLog
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog { String value() default "";
}
  1. 定义日志拦截切面 SysLogAspect ,解析带有SysLog注解的controller
@Around("@annotation(sysLog)")
public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable {
long beginTime = SystemClock.now();
//执行方法
Object result = joinPoint.proceed();
//执行时长(毫秒)
long time = SystemClock.now() - beginTime; SysLog sysLogEntity = new SysLog();
if(sysLog != null){
//注解上的描述
sysLogEntity.setOperation(sysLog.value());
} //请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
sysLogEntity.setMethod(className + "." + methodName + "()"); //请求的参数
Object[] args = joinPoint.getArgs();
String params = Json.toJsonString(args[0]);
sysLogEntity.setParams(params); //设置IP地址
sysLogEntity.setIp(IPHelper.getIpAddr()); //用户名
String username = SecurityUtils.getSysUser().getUsername();
sysLogEntity.setUsername(username); sysLogEntity.setTime(time);
sysLogEntity.setCreateDate(new Date());
//保存系统日志
sysLogService.save(sysLogEntity); return result;
}

注解的松耦合性给编程带来了极大的便利。

最新文章

  1. C# MVC ( 添加路由规则以及路由的反射机制 )
  2. hdu 2476 String Painter
  3. document.images、document.forms、doucument.links——>HTMLCollection
  4. 技术英文单词贴--P
  5. hdu 4240 Route Redundancy 最大流
  6. UML元素分析
  7. PHP与MySQL中编码的设置
  8. lua function
  9. 玩转Web之easyui(一)-----easy ui datagird 分页
  10. JavaService实现Windows服务
  11. python 类的进阶
  12. android 自定义下拉菜单
  13. [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)
  14. (链表 set) leetcode 817. Linked List Components
  15. Qt编写自定义控件属性设计器
  16. java获得当前系统时间三种方法
  17. thinkphp5 查询的数据是对象时,获取原始数据方法
  18. Windows环境搭建ElasticSearch 5.*并配置head
  19. .net core中使用缓存(cache)
  20. 洛谷 P4292 [WC2010]重建计划 解题报告

热门文章

  1. VSCode 使用 Code Runner 插件无法编译运行文件名带空格的文件
  2. jquery 选择器 模糊匹配
  3. Series 1 java秒组合数
  4. springCloud--admin监控使用
  5. Python 删除满足条件的某些行
  6. vim 知识点小结
  7. buu crypto 凯撒?替换?呵呵!
  8. 链表逆序---python
  9. python操作elasticsearch增、删、改、查
  10. 微信小程序云开发-云函数-云函数获取参数并实现运算