2019独角兽企业重金招聘Python工程师标准>>>

直接上代码:

@Aspect
@Component
public class LogErrorAspect {

private static final Logger LOGGER = LoggerFactory.getLogger(LogErrorAspect.class);

private static final String NB = "nb";

@Pointcut(value = "within(com.aop.service.order..*) && @annotation(com.aop.intf.dto.order.EasyValid)")

public void logErrorPointCut(){

}
/*

异常拦截加参数e

@AfterThrowing(value="within(com.aop.ysma..*)", throwing="e")

可行方案:能拦截到service层代码,但是如此书写却是拦截不到controller的
@Around("within(com.aop.service.order..*) && @annotation(easyValid)")
  可行方案:能拦截到service和controller层代码 两个参数
@Around(value = "execution(@com.aop.service.order * *(..)) && @annotation(easyValid)")
  可行方案:能拦截到service和controller层代码

@Around("within(com.ysma.aop..*) && @annotation(com.ysma.aop.intf.base.db.ReadOnly)")
可行方案

@Around("@annotation(com.aop.service.order.EasyValid)")
public Object aroundSimple(ProceedingJoinPoint pj, EasyValid easyValid) throws Throwable {
   LOGGER.debug("diy aroundSimple =================");
   return pj.proceed();
}*/

/**不可行方案

@Around(value = "logErrorPointCut() && args(com.aop.intf.dto.order.EasyValid)", argNames = "pj, easyValid")

*/
    @Around(value = "logErrorPointCut() && args(easyValid)", argNames = "pj, easyValid")
    public Object around(ProceedingJoinPoint pj, EasyValid easyValid) throws Throwable {
    /*@Around("logErrorPointCut()")
    public Object around(ProceedingJoinPoint pj) throws Throwable {*/
        //pj.getClass().getAnnotation(EasyValid.class);
        LOGGER.debug("diy operation =================");
        if(easyValid == null){
            LOGGER.debug("easyValid is null =================");
            return pj.proceed();
        }
        boolean nb = NB.equals(easyValid.source());

return pj.proceed();
    }

}

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

/**
    * b/g 必须输入
    * @return
    */
   String source();

/**
    * 入参 必须输入
    * @return
    */
    String operatiton() default "";
}

注:被注解的方法须是public方法 protect和private方法虽不会报错却也不会生效

那么问题来了:采用不可行方案将pointcut和advice拆分开来我的切面就拦截不到标记了annotation的服务;

采用可行方案将pointcut和advice不拆分,就能正常获取参数并拦截标记了annotation的服务;

备注:1、我跟踪了一下spring的源码,发现采用不可行的方案时,spring只会取其中的easyValid参数并匹配并且成功匹配到了也能将对应的标记了@EasyValid的服务作为cancaditate加入候选者列表等待匹配调用。
         但是临门一脚的时候就跳过了我的LogErrorAspect切面了。

2、我将pj做为参数放入到args里面也会报错。说没有匹配类型的参数。是因为ProceedingJoinPoint是JoinPoint的子类的缘故么?貌似这么理解也不太科学

猜想:是不是代理类proxy在invocation的时候发现参数数目不匹配跳过了不可行方案的方法?

3、之前有看过文章说 controller并不在spring管理范围内,service在spring管理范围内。 所以service走spring代理,aop切面都能切中,但是controller就切不中
         此处提供了另类的方式切中controller的aop方式

求教:pointcut和advice拆分的情况下如何定义除pj以外的参数

转载于:https://my.oschina.net/ysma1987/blog/597601

@Aspect @around 多个参数相关推荐

  1. 用python绘制漂亮的图形-用python绘制图形的实例详解

    1.环境系统:windows10 python版本:python3.6.1 使用的库:matplotlib,numpy 2.numpy库产生随机数几种方法import numpy as npnumpy ...

  2. Spring Aop之Advisor解析

    2019独角兽企业重金招聘Python工程师标准>>> 在上文Spring Aop之Target Source详解中,我们讲解了Spring是如何通过封装Target Source来 ...

  3. threejs相机和渲染器

    渲染器 渲染器其实代表的是canvas标签. 渲染器的类型 WebGLRender 使用WebGL来渲染图形,速度较快,但是有些机器不支持WebGL. CanvasRender 使用canvas2d来 ...

  4. matplotlib入门基础(五)轴坐标范围 轴刻度比例 轴刻度

    这篇文章同样以面向对象风格为主,介绍设置轴坐标范围.轴刻度比例.轴刻度(xtick,ytick)的方法. 这篇文章分以下部分来介绍: 1. 设置轴坐标范围 2. 设置轴刻度比例 3. 设置轴刻度 1. ...

  5. 深度学习Spring5底层原理(黑马学习随笔)

    学习随笔简介 跟随着黑马满老师的<黑马程序员Spring视频教程,全面深度讲解spring5底层原理>学习,视频教程地址:黑马程序员Spring视频教程,全面深度讲解spring5底层原理 ...

  6. FFMpeg4.0相关结构体和函数

    文章目录 相关指令 相关结构体 av_register_all() 已废弃无需添加 avformat_network_init() 初始化网络封装库 AVFormatContext结构体 AVDict ...

  7. 深度语义理解在剧本角色情感分析中的探索与应用

    深度语义理解在剧本角色情感分析中的探索与应用 1.背景 剧本分析是内容生产链条的第一环,因此,我们结合专家经验知识,大数据与自然语言处理计数来帮助业务部门快速分析和评估剧本.评估体系中涉及到了大量关于 ...

  8. 六大数据统计图——Python的数据可视化

    一直以来,数据可视化就是一个处于不断演变之中的概念,其边界在不断地扩大:因而,最好是对其加以宽泛的定义.数据可视化指的是技术上较为高级的技术方法,而这些技术方法允许利用图形.图像处理.计算机视觉以及用 ...

  9. FFmpeg 常用选项功能说明(视频专家地址)

    简介与其他资料:   - http://www.5i01.cn/topicdetail.php?f=510&t=3734550 FFmpeg 常用选项功能说明 由于 FFmpe 功能太庞大了, ...

最新文章

  1. 实验02 Linux文件和目录管理
  2. 简单描述DDL、DCL、DML
  3. 共享内存+Shellcode实现跨进程调用3环函数
  4. anemometer mysql_MySQL慢日志简介及Anemometer工具介绍 | | For DBA
  5. sonar的安装以及使用
  6. [Silverlight]TextBlock控件全攻略
  7. Repeater,DataList,DataGrid 【转】
  8. Do not mutate vuex store state outside mutation handlers.
  9. 华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动
  10. python生成多个随机数列表_在python中生成1到6之间的6个随机数的列表
  11. 中国内窥镜光学物镜市场趋势报告、技术动态创新及市场预测
  12. 凸优化第八章几何问题 8.5中心
  13. ISO 17799 /27001标准简介
  14. 《Nature》论文插图的Matlab复刻第4期—单组多色柱状图(Part2-82)
  15. 三极管放大电路驱动蜂鸣器
  16. 闽江学院计算机毕设,闽江学院软件学院关于2017届毕业论文答辩有关事项的通知...
  17. 驾照科目一/科目四 知识点
  18. 谷粒商城简介(1~5集)
  19. python 爱心文字墙_博客园墙裂推荐!从未见过如些清新脱俗的完整Python+requests接口自动化测试框架搭建文章!...
  20. 光纤中的多种光学模式芯径_光纤激光器的重要参数BPP(M2)

热门文章

  1. Oracle中的左连接与右连接
  2. kafka组件makemirror处理跨机房业务的应用
  3. 元素赋值、增加元素和删除元素
  4. eclipse Dynamic web module相关问题
  5. 微信小程序开发实战——模块化
  6. select学习小demo--实现网页换肤
  7. 按字节提取整形数值(按位与运算符“”、右移位运算符“”)
  8. Q102:光线追踪场景(4)——面朝大海
  9. 抽象类继承 java_java继承抽象类
  10. cad怎么表示出一个孔_怎么训练出一个NB的Prophet模型