网站推荐、资源下载等 | 个人网站

【springboot】AOP(注解版)使用例子

1、简单使用,打印访问方法时,进入、方法全限定名称、参数索引位置、参数类型及内容(如果为null就只打印null)、正常/异常退出。

1.1、定义注解用于切面

package com.frame.annotation;


import java.lang.annotation.*;

/**
 * 方法日志注解
 *
 * @author lw
 * @version V1.0
 * @Title: MothodLog.java
 * @Package com.frame.base.annotation
 * @Description: 注解在被访问的方法时,打印类名、方法名、参数。方便上线排错
 * @date 2019年12月23日 下午3:21:33
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MothodLogPrint {
}

 

1.2、切面类

package com.frame.sys.aop;

import com.frame.annotation.MothodLogPrint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.Map;

/**
 * MothodLogPrintAspect利用spring的aop实现日志的打印
 *
 * @auther lw
 * @date 2019-12-24 15:32:33
 */
@Aspect
@Component
public class MothodLogPrintAspect {

    private static final Logger logger = LoggerFactory.getLogger(MothodLogPrintAspect.class);

    @Around("@annotation(mothodLogPrint)")
    public Object advice(ProceedingJoinPoint joinPoint, MothodLogPrint mothodLogPrint){
        String className = joinPoint.getTarget().getClass().getName();
        String mothodName = joinPoint.getSignature().getName();
        logger.info(">>>>>>>>>进入,方法:[" + className + "." + mothodName + "]");
        Object[] args = joinPoint.getArgs();
        String mothodPropertion = getMothodPropertion(className, mothodName, args);
        logger.info(mothodPropertion);
        Object proceed = null;
        try {
            proceed = joinPoint.proceed();
            logger.info("<<<<<<<<<正常,退出方法:[" + className + "." + mothodName + "]");
        } catch (Throwable throwable) {
            logger.error(throwable.getMessage(), throwable);
            logger.info("<<<<<<<<<异常,退出方法:[" + className + "." + mothodName + "]");
        }
        return proceed;
    }

    /**
     * 获取方法和参数内容
     *
     * @param className 类名 非必填
     * @param mothodName 方法名 必填
     * @param agrs 参数列表
     * @return
     */
    public static String getMothodPropertion(String className, String mothodName, Object ... agrs) {
        StringBuilder sb = new StringBuilder();
        if(null != className) {
            sb.append("类名:[").append(className).append("]\r\n");
        }
        sb.append("方法:[").append(mothodName).append("]");
        if(null != agrs) {
            for(int i = 0; i < agrs.length; i++) {
                Object obj = agrs[i];
                sb.append("\r\n参数索引:[").append(i).append("],");
                if(null == obj) {
                    sb.append("为null");
                } else {
                    sb.append("类型:[").append(obj.getClass().getName()).append("],");
                    if(obj instanceof Collection) {
                        Collection collection = (Collection)obj;
                        sb.append("长度:[").append(collection.size()).append("],内容:[").append(collection).append("]");
                    } else if(obj instanceof Map) {
                        Map map = (Map)obj;
                        sb.append("长度:[").append(map.size()).append("],内容:[").append(map).append("]");
                    } else if(obj.getClass().isArray()) {
                        Object[] objects = (Object[])obj;
                        sb.append("长度:[").append(objects.length).append("],内容:[").append(objects).append("]");
                    } else if(obj instanceof String) {
                        sb.append("内容:[").append(obj).append("]");
                    } else {
                        sb.append("内容:[").append(String.valueOf(obj)).append("]");
                    }
                }
            }
        }
        return sb.toString();
    }

}

 

1.3、用于切面的例子

com.frame.solr.service.SolrService#getByMap

 

1.4、打印日记

 

 

2、切面修改参数再访问

2.1、注解

package com.frame.annotation;


import java.lang.annotation.*;

/**
 * solr、db查询模式
 *
 * @author lw
 * @version V1.0
 * @Title: SolrOrDbStrategy.java
 * @Package com.frame.base.annotation
 * @Description: 注解在被访问的方法时,方式有个参数可根据solr还是db来进行查询
 * @date 2020年2月11日 下午4:21:33
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SolrOrDbStrategy {
}

 

2.2、切面类

package com.frame.sys.aop;

import com.frame.annotation.SolrOrDbStrategy;
import com.frame.modules.dabis.archives.ArchivesConstant;
import com.frame.solr.em.SolrCode;
import com.frame.solr.service.SolrService;
import com.frame.strategy.StrategySituation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * SolrOrDbStrategyAspect利用spring的aop实现solr查询异常时转db
 * 默认是用solr查询,如果solr断了就切换到mysql查询。如果是solr语句有问题则不切换
 *
 * @auther lw
 * @date 2020-2-11 16:20:33
 */
@Aspect
@Component
public class SolrOrDbStrategyAspect {

    private static final Logger logger = LoggerFactory.getLogger(SolrOrDbStrategyAspect.class);

    @Autowired
    private SolrService solrService;

    @Autowired
    private StrategySituation strategySituation;

    @Around("@annotation(solrOrDbStrategy)")
    public Object advice(ProceedingJoinPoint joinPoint, SolrOrDbStrategy solrOrDbStrategy){
        Object[] args = joinPoint.getArgs();
        Object proceed = null;
        try {
            if (ArchivesConstant.queryType.SOLR.getValue().equals(StrategySituation.getTheCurrentStrategy())) {
                proceed = joinPoint.proceed();
                logger.info("使用solr查询");
            } else {
                for (int i = 0; i < args.length; i++) {
                    Object obj = args[i];
                    if (ArchivesConstant.queryType.SOLR.getValue().equals(obj) || ArchivesConstant.queryType.DB.getValue().equals(obj)) {
                        // 修改参数
                        args[i] = ArchivesConstant.queryType.DB.getValue();
                        break;
                    }
                }
                // 修改参数后再执行方法
                proceed = joinPoint.proceed(args);
                logger.info("使用db查询");
            }
        } catch (Throwable throwable) {
            if (solrService.detectSolrConnection(SolrCode.ARCHIVES.getValue())) {
                logger.error("solr连接正常,solr语句有误", throwable);
            } else {
                for (int i = 0; i < args.length; i++) {
                    Object obj = args[i];
                    if (ArchivesConstant.queryType.SOLR.getValue().equals(obj) || ArchivesConstant.queryType.DB.getValue().equals(obj)) {
                        // 修改参数
                        args[i] = ArchivesConstant.queryType.DB.getValue();
                        break;
                    }
                }
                try {
                    // 修改参数后再执行方法
                    proceed = joinPoint.proceed(args);
                    logger.error("solr连接异常,转db查询");
                    strategySituation.switchState(ArchivesConstant.queryType.DB.getValue());
                } catch (Throwable e) {
                    logger.error("db查询异常", e);
                }
            }
        }
        return proceed;
    }

}

 

 

2.3、切入

 

 

2.4、结果

正常

 

solr断了

 

 

 

3、可根据类型处理

3.1、注解需要type

 

 3.2、切面类根据不同type处理

 

3.3、切入

 

 

 

posted @ 2020-02-20 16:07  xiaostudy  阅读(1012)  评论(0编辑  收藏  举报
网站推荐
[理工最爱]小时百科 |  GitHub |  Gitee |  开源中国社区 |  牛客网 |  不学网论坛 |  r2coding |  冷熊简历 |  爱盘 |  零散坑 |  bootstrap中文网 |  vue.js官网教程 |  源码分享站 |  maven仓库 |  楼教主网站 |  廖雪峰网站 |  w3cschool |  在线API |  代码在线运行 |  [不学网]代码在线运行 |  JS在线运行 |  PHP中文网 |  深度开源eclipse插件 |  文字在线加密解密 |  菜鸟教程 |  慕课网 |  千图网 |  手册网 |  素材兔 |  盘多多 |  悦书PDF |  sumatra PDF |  calibre PDF |  Snipaste截图 |  shareX截图 |  vlc-media-player播放器 |  MCMusic player |  IDM下载器 |  格式工厂 |  插件网 |  谷歌浏览器插件 |  Crx搜搜 |  懒人在线计算器 |  leetcode算法题库 |  layer官网 |  layui官网 |  formSelects官网 |  Fly社区 |  程序员客栈 |  融云 |  华为云 |  阿里云 |  ztree官网API |  teamviewer官网 |  sonarlint官网 |  editormd |  pcmark10官网 |  crx4chrome官网 |  apipost官网 |  花生壳官网 |  serv-u官网 |  杀毒eset官网 |  分流抢票bypass官网 |  懒猴子CG代码生成器官网 |  IT猿网 |  natapp[内网穿透] |  ngrok[内网穿透] |  深蓝穿透[内网穿透] |  WakeMeOnLan[查看ip] |  iis7 |  [漏洞扫描]Dependency_Check官网 |  [图标UI]fontawesome官网 |  idea插件官网 |  路过图床官网 |  sha256在线解密 |  在线正则表达式测试 |  在线文件扫毒 |  KuangStudy | 
资源下载
电脑相关: Windows原装下载msdn我告诉你 |  U盘制作微PE工具官网下载 |  Linux_CentOS官网下载 |  Linux_Ubuntu官网下载 |  Linux_OpenSUSE官网下载 |  IE浏览器官网下载 |  firefox浏览器官网下载 |  百分浏览器官网下载 |  谷歌google浏览器历史版本下载 |  深度deepin系统官网下载 |  中兴新支点操作系统官网下载 |  文件对比工具Beyond Compare官网下载 |  开机启动程序startup-delayer官网下载 |  openoffice官网下载 |  utorrent官网下载 |  qbittorrent官网下载 |  cpu-z官网下载 |  蜘蛛校色仪displaycal官网下载 |  单文件制作greenone下载 |  win清理工具Advanced SystemCare官网下载 |  解压bandizip官网下载 |  内存检测工具memtest官网下载 |  磁盘坏道检测与修复DiskGenius官网下载 |  磁盘占用可视化SpaceSniffer官网下载 |  [磁盘可视化]WizTree官网下载 |  win快速定位文件Everything官网下载 |  文件定位listary官网下载 |  动图gifcam官网下载 |  7-Zip官网下载 |  磁盘分区工具diskgenius官网下载 |  CEB文件查看工具Apabi Reader官网下载 |  罗技鼠标options官网下载 |  [去除重复文件]doublekiller官网下载 | 
编程相关: ApacheServer官网下载 |  Apache官网下载 |  Git官网下载 |  Git高速下载 |  Jboss官网下载 |  Mysql官网下载 |  Mysql官网历史版本下载 |  NetBeans IDE官网下载 |  Spring官网下载 |  Nginx官网下载 |  Resin官网下载 |  Tomcat官网下载 |  jQuery历史版本下载 |  nosql官网下载 |  mongodb官网下载 |  mongodb_linux历史版本下载 |  mongodb客户端下载 |  VScode官网下载 |  cxf官网下载 |  maven官网下载 |  QT官网下载 |  SVN官网下载 |  SVN历史版本下载 |  nodeJS官网下载 |  oracle官网下载 |  jdk官网下载 |  STS官网下载 |  STS历史版本官网下载 |  vue官网下载 |  virtualbox官网下载 |  docker desktop官网下载 |  github desktop官网下载 |  EditPlus官网下载 |  zTree下载 |  layui官网下载 |  jqgrid官网下载 |  jqueryui官网下载 |  solr历史版本下载 |  solr分词器ik-analyzer-solr历史版本下载 |  zookeeper历史版本官网下载 |  nssm官网下载 |  elasticsearch官网下载 |  elasticsearch历史版本官网下载 |  redis官网下载 |  redis历史版本官网下载 |  redis的win版本下载 |  putty官网下载 |  查看svn密码TSvnPD官网下载 |  MongoDB连接工具Robo官网下载 |  dll查看exescope官网下载 |  dll2c官网下载 |  接口测试apipost官网下载 |  接口测试postman官网下载 |  原型设计工具AxureRP官网下载 |  canal官网下载 |  idea主题样式下载 |  vue的GitHub下载 |  finalShell官网下载 |  ETL工具kafka官网下载 |  cavaj[java反编译]官网下载 |  jd-gui[java反编译]官网下载 |  radmin[远程连接]官网下载 |  tcping[win ping端口]下载 |  jQueryUploadFile官网下载 |  RedisPlus下载 |  aiXcoder智能编程助手官网下载 |  [表单效验]validform官网下载 |  idea官网下载 |  RedisStudio下载 |  MD转word含公式pandoc官网下载 |  logviewer官网下载 |  Kafka官网下载 |  hbase高速下载 |  hadoop官网下载 |  hadooponwindows的GitHub下载 |  hive官网下载 |  soapui官网下载 |  flink官网下载 |  kafkatool官网下载 |  MinIO官网下载 |  MinIO中国镜像下载 | 
办公相关工具
免费在线拆分PDF【不超过30M】 |  免费在线PDF转Word【不超过10M】 |  在线文字识别转换【不超过1M】 |  PDF转换成Word【不超过50M】 |  在线OCR识别 |  Smallpdf |  文件转换器Convertio |  迅捷PDF转换器 |  字母大小写转换工具 |  档铺 |  快传airportal[可文字] |  快传-文叔叔 |  P2P-小鹿快传 |  [图床]ImgURL | 
网站入口
腾讯文档 |  有道云笔记网页版 |  为知笔记网页版 |  印象笔记网页版 |  蓝奏云 |  QQ邮箱 |  MindMaster在线思维导图 |  bilibili |  PDM文件在线打开 |  MPP文件在线打开 |  在线PS软件 |  在线WPS |  阿里云企业邮箱登陆入口 | 
其他
PDF转换 |  悦书PDF转换 |  手机号注册查询 |  Reg007 |  akmsg |  ip8_ip查询 |  ipip_ip查询 |  天体运行testtubegames |  测试帧率 |  在线网速测试 |