博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@Aspect @around 多个参数
阅读量:6593 次
发布时间:2019-06-24

本文共 2498 字,大约阅读时间需要 8 分钟。

hot3.png

直接上代码:

@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

你可能感兴趣的文章
[20170426]漫长的测试时间.txt
查看>>
javaScript中eval()方法转换json对象
查看>>
【问题解决】BootStrap.css与layDate日期选择样式起冲突的解决办法
查看>>
ArcGis 在线地图相关资源
查看>>
构建安全的Xml Web Service系列之初探使用Soap头
查看>>
触摸识别技术将被智能机抛弃?它还能应用于这些安全系统识别
查看>>
基于AForge.Net框架的扑克牌识别
查看>>
可扩展Web架构与分布式系统
查看>>
爱润妍代理模式营销系统
查看>>
ZOJ Problem Set - 3758 素数
查看>>
Knockout应用开发指南 第九章:高级应用举例
查看>>
用无向带权图实现校园导航系统
查看>>
再谈pipeline-filter模式
查看>>
华山论剑之契约式编程与防御式编程
查看>>
iOS工程中删除默认的并使用自建的ViewController后黑屏
查看>>
当开源库碰到错误怎么办?
查看>>
计算机组成原理与机构期末复习的概念
查看>>
HTAP数据库——HybirdDB for MySQL产品和典型方案介绍
查看>>
YUV 像素格式
查看>>
您所在企业是否需要首席数据官?
查看>>