• Spring AOP面向切面编程,监听某个方法


    1、单独监听某一个方法,方法的参数名称必须与args定义的参数名称一致

        @AfterReturning(pointcut = "execution(* com.gmall88.server.manager.superapp.SuperAppServerManager.notifyRefund(..))&&args(notifyUrl, refundId, batchNo, callResult)", returning = "resultValue")
        public void handleInsertCallBackLogNotifyRefund(String resultValue,String notifyUrl, String refundId, String batchNo,String callResult){
            try {
                logger.info("refundId"+refundId);
                logger.info(resultValue);
                String result = com.gmall88.server.util.StringUtils
                        .lessWord(resultValue, 1000 - 3);
                String type = SuperAppConstant.REFUND_CALL_BACK_TYPE;
                int notifyStatus = SuperAppConstant.NOTIFY_STATUS_SUCCESS;
                superAppServerManager.addCallBackLog(refundId,refundId,result,type,notifyStatus);
            } catch (Exception e) {
                logger.error(e.getMessage(),e);
            }
        }
        @AfterThrowing(pointcut = "execution(* com.gmall88.server.manager.superapp.SuperAppServerManager.notifyRefund(..))&&args(notifyUrl, refundId, batchNo, callResult)", throwing="ex")
        public void handleNotifyRefundAfterThrow(Throwable ex,String notifyUrl, String refundId, String batchNo,String callResult){
                
            try {
                logger.info("handleNotifyRefundAfterThrow refundId:" + refundId);
                logger.info(ex.getMessage());
                String result = com.gmall88.server.util.StringUtils
                        .lessWord(ex.getMessage(), 1000 - 3);
                String type = SuperAppConstant.REFUND_CALL_BACK_TYPE;
                int notifyStatus = SuperAppConstant.NOTIFY_STATUS_FAIL;
                superAppServerManager.addCallBackLog(refundId, notifyUrl, result, type, notifyStatus);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
        }

    2、监听多个方法,可以是某个方法的开头(以handle开头命名的方法)

    // handleCash
        @Pointcut("execution(* com.gmall88.server.manager.superapp.SuperAppServerManager.handle*(..))")
        public void handleCash(){
            
        }
        @Pointcut("execution(* com.gmall88.server.manager.superapp.SuperAppServerManager.addDo*(..))")
        public void addDo(){
            
        }
        @Pointcut("execution(* com.gmall88.server.manager.superapp.SuperAppServerManager.handleRetry*(..))")
        public void handleRetry(){
            
        }
        @AfterReturning(pointcut = "handleCash() || handleRetry()", returning = "resultValue")
        public void handleCashAfterReturning(JoinPoint jp, Object resultValue) {
            try {
                Object[] parames = jp.getArgs();// 获取目标方法体参数
                String params = parseParames(parames); // 解析目标方法体的参数
                String className = jp.getTarget().getClass().toString();// 获取目标类名
                className = className.substring(className.indexOf("com"));
                logger.info("params" + params);
                String signature = jp.getSignature().toString();// 获取目标方法签名
                String methodName = signature.substring(signature.lastIndexOf(".") + 1, signature.indexOf("("));
                logger.info("methodName" + methodName);
                ReturnResult result = new ReturnResult();
                String msg= "";
                int code = -1;
                if(resultValue instanceof Map){
                    Map map = (Map) resultValue;
                    if(map.containsKey("errorMsg")){
                        msg= (String) map.get("errorMsg");
                    }
                }else if(resultValue instanceof ReturnResult){
                    result = (ReturnResult) resultValue;
                    code = result.getCode();
                    if(code == ReturnCodeType.NOT_FOUND.getCode()){
                        msg = result.getMessage();
                    }
                }else{
                    if(resultValue !=null){
                        msg = resultValue.toString();
                    }
                }
                if (StringUtils.isNotBlank(msg)) {
                    String res = com.gmall88.server.util.StringUtils.lessWord(msg, 1000 - 3);
                    Map map = new HashMap();
                    map.put("code", code);
                    map.put("params", params);
                    map.put("message", res);
                    JSONObject obj = JSONObject.fromObject(map);
                    String type ="AfterReturning:"; 
                    String objString = new String(obj.toString().getBytes("UTF-8"));  
                    String objUTF8 = URLEncoder.encode(objString, "UTF-8");  
                    superAppServerManager.addJmsSendEmailToMq(className,methodName,objString,type);
                }
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
        }
  • 相关阅读:
    JSON以及Java转换JSON的方法(前后端经常使用处理方法)
    让cocos2dx支持并通过arm64 编译
    matlab7安装后的常见问题
    Open SSH原理
    Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization
    12C -- 配置EM Express的端口
    ORA-16179: incremental changes to "log_archive_dest_1" not allowed with SPFILE
    ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or LOG_ARCHIVE_DUPLEX_DEST
    11g新特性-SQL Plan Management
    11g新特性-自动sql调优(Automatic SQL Tuning)
  • 原文地址:https://www.cnblogs.com/ouyanxia/p/9141094.html
Copyright © 2020-2023  润新知