首页 > 编程语言 >java笔记_12_自定义注解

java笔记_12_自定义注解

时间:2023-08-09 11:34:27浏览次数:48  
标签:12 java 自定义 joinPoint paramJson approvalTaskRecord 注解 class 描述

1、@interface

用于声明注解,参数只用八种基本数据类型和四种数据类型(基本类型 byte,short,char,int,long,float,double,boolean 八种基本数据类型 和 String,Enum,Class,annotations ),如果只有一个参数成员,最好把参数名称设为"value"

2、@Target
说明了Annotation所修饰的对象范围,取值(ElementType)有:
CONSTRUCTOR(用于描述构造器)
FIELD(用于描述域,作用于属性)
LOCAL_VARIABLE(用于描述局部变量)
METHOD(用于描述方法,作用于方法)
PACKAGE(用于描述包)
PARAMETER(用于描述参数)
TYPE(用于描述类、接口(包括注解类型) 或enum声明,作用于类)

3、@Retention

设置注解的生命周期
RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃
RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

4、@Document

用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共API,因此可以被例如 javadoc 此类的工具文档化。Documented 是一个标记注解,没有成员。

表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)。

5、@Inhrited

是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited 修饰的 annotation类型 被用于一个 class,则这个 annotation 将被用于该class的子类。

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApprovalTaskRecord {

    /**
     * 方法描述:权限点
     * 参数类型 参数名() 默认值
     */
    String permission() default "";

    /**
     * 方法描述:微服务名@微服务方法名
     * 参数类型 参数名() 默认值
     */
    String interfacePath() default "";
}
自定义注解使用:
@ApprovalTaskRecord(permission = "111",interfacePath = "222")
@ApiOperation("新增")
@PostMapping("/insert")
public ResultResp<ParamResp> insert(@RequestBody @Validated InsertReq req){
    ParamResp data = paramService.insert(req);
    return ResultResp.success(data);
}

方法实现:

// aop

@Slf4j
@Aspect
@Component
public class ApprovalTaskLogAspect {

    @Autowired
    ApprovalTaskLogService approvalTaskLogService;

    @Pointcut("@annotation(com.apexsoft.crm.ams.annotation.ApprovalTaskRecord)")
    public void record() {
    }

    /**
     * 环绕增强,相当于 MethodInterceptor
     */
    @Around("record() && @annotation(approvalTaskRecord)")
    public Object doAround(ProceedingJoinPoint joinPoint, ApprovalTaskRecord approvalTaskRecord) throws Throwable {
        Object res = null;

        try {
            if (approvalStatus(approvalTaskRecord) == false) {
                // 执行原有方法
                res = joinPoint.proceed();
            } else {
                // 拦截,执行自定义写日志方法,原有方法不执行;如果要执行,加上res = joinPoint.proceed()方法调用;
                addApprovalTaskLog(joinPoint, approvalTaskRecord);
            }
        } catch (Exception e) {
            log.error("ApprovalTaskLogAspect 操作落库失败:" + e.getMessage());
        }
        return res;
    }

    /**
     * 判断是否需要审批
     * @param
     * @return
     */
    private Boolean approvalStatus (ApprovalTaskRecord approvalTaskRecord) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("operatePrivilege", approvalTaskRecord.permission());
        String approvalStatus = approvalTaskLogService.selApprovalStatus(paramJson);
        if (approvalStatus!= null && "1".equals(approvalStatus)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 方法执行前,增加日志
     *
     * @param joinPoint
     * @param approvalTaskRecord
     */
    private void addApprovalTaskLog(JoinPoint joinPoint, ApprovalTaskRecord approvalTaskRecord) {
        JSONObject paramJson = new JSONObject();
        // 获取入参数据,在方法执行前没有出参数据
     Object[] paramValues = joinPoint.getArgs();
        String params = "";
        if (paramValues != null && paramValues.length > 0) {
            for (Object o : paramValues){
                if(!Objects.isNull(o)){
                    try {
                        String jsonObj = JSON.toJSONString(o);
                        params += jsonObj + " ";
                    } catch (Exception e) {

                    }
                }
            }
        }
        paramJson.put("requestBody", params); // {"id":1,"name":"123123"} 
     // 获取注解中传入的数据
        paramJson.put("operatePrivilege", approvalTaskRecord.permission()); // 111
        paramJson.put("interfacePath", approvalTaskRecord.interfacePath()); // 222

        log.info("对象approvalTaskLogModel:" + paramJson);
     // 调用写日志方法
        approvalTaskLogService.approvalTaskLog(paramJson);
    }
}

 


参考:

https://blog.csdn.net/qq_38617531/article/details/125719481

https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650238479&idx=1&sn=cef582b5c5a15853f391d013a0747a9d&chksm=88639f60bf1416761f9da62e7b59c0d2f892d1b6f6e85a809f963dca593cffdcb14a9e171ddb&scene=27


标签:12,java,自定义,joinPoint,paramJson,approvalTaskRecord,注解,class,描述
From: https://www.cnblogs.com/luyuting/p/17593036.html

相关文章

  • java XSSFWorkbook excel 公式计算
    excel公式计算//创建一个工作薄XSSFWorkbookworkbook=newXSSFWorkbook();//如果是最后一列添加一个求和计算,将结果放到同一列最后一个。dataLists数据列表XSSFSheetsheet=workbook.getSheet(replaceSpecStr(sheetNames.get(0)));Rowrow......
  • JavaSE概览
    一、JavaSE基础day01#day011.Java语言发展史2.Java语言跨平台原理3.JRE和JDK4.常用DOS命令5.HelloWorld案例6.注释7.关键字8.常量9.数据类型10.变量11.变量使用的注意事项12.标识符13.类型转换day02#day021.算数运算符2.字符的+操作3.字......
  • JavaSE--多态在开发中的作用
    一、多态在开发中的作用  1、降低程序的耦合度,提高程序的扩展力  publicclassMaster(){    publicvoidfeed(Dogd){}    publicvoidfeed(Dogd){}  }  以上代码中:Master和Dog、Cat关系紧密,耦合度高,导致扩展力很差  publicclassMaster(){   ......
  • 分享 Java 开发中常用到的设计模式(一)
    分享Java开发中常用到的设计模式(一)前言不知道大家在开发的时候,有没有想过(遇到)这些问题:大家都是按需要开发,都是一个职级的同事,为什么有些人的思路就很清晰,代码也很整洁、易懂;而自己开发,往往不知道怎么下手设计,写完了也是bug一堆,codereview的时候更是频频被怼...感觉每天都是......
  • JavaSE--super关键字
    一、super关键字1、super是一个关键字,全部小写2、this与super对比  this:    this可以出现在实例方法中和构造方法中    语法:this.或者this()    this不能使用在静态方法中    this.大部分可以省略,在区分局部变量和实例变量的时候不能省略,    this......
  • JavaSE--方法覆盖和多态
    一、方法覆盖Override1、什么时候使用Override  例如:以下代码:鸟儿在执行move方法时,最好输出“鸟儿在飞翔”,但是当前程序在执行move方法时,输出“动物在移动”,显然Bird子类继承来的方法无法满足需求  子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,子类有权......
  • JavaSE--封装
    一、封装概念及作用1、封装  现实生活中很多都是封装的,例如手机、笔记本电脑......外部有一个壳子保护内部的部件,保证内部的部件是安全的  封装之后对于我们使用者来说不需要了解内部的结构和关心内部的复杂,只需要使用就可以2、封装的作用保证内部结构的安全屏蔽复杂,暴......
  • JavaSE--继承
    一、继承extends1、继承的作用  基本作用:子类继承父类,代码可以得到复用  主要作用:因为有了继承关系,才有了后期的方法覆盖和多态机制2、继承的语法结构class类名extends父类名{类体;}//使用继承机制来解决代码复用问题。//继承也是存在缺点的:耦合度高,父类修......
  • 利用pytorch自定义CNN网络(一):torchvision工具箱
    本文是利用pytorch自定义CNN网络系列的第一篇,主要介绍torchvision工具箱及其使用,关于本系列的全文见这里。笔者的运行设备与软件:CPU(AMDRyzen™54600U)+pytorch(1.13,CPU版)+jupyter;本文所用到的资源:链接:https://pan.baidu.com/s/1WgW3IK40Xf_Zci7D_BVLRg提取码:1212......
  • JAVASE学习笔记
    JavaSE基础知识1、Java应用与特性jdk8常用jdk11常用jdk17推荐使用java之父高斯林1、常用的java程序分为JavaSE、JavaEE、JavaME三个版本2、J2SE:定位在服务端的开发(WEB网页)3、JavaME:定位在消费行电子产品的应用上。特性和优势:1、面向对象2、可移植性3、高性能4、......