zoukankan      html  css  js  c++  java
  • spring 之AOP 和继承方法

    1.spring AOP 会忽略切面类从父类继承的方法,除非在切面类,也就是子类中对父类方法覆盖@Override. 

    package com.skyline.dao;
    @Repository
    public
    class A{   public void a(){
        //implements....
      }
    public void aa(){    //implements...   }   

    }
    package com.skyline.service;
    @Service
    public
    class B implements A{ @Autowired
      private A a;
    public void b(){     //重复调用a.a()
    } }

    <
    aop:pointcut expression="execution(* com.skyline.service.*.*(..))" id="log_service"/> <aop:before pointcut-ref="log_service" method="doBefore"/>

    如上述的例子中,用service 层的类继承dao层的类就是为了不用在service 层再次写调用dao层方法,避免代码重复.

    这样带来的问题之一就是AOP 只对service层自己定义的方法进行切入.如b().

    如果改下切面如下:

     <aop:pointcut expression="execution(* com.skyline.dao.*+.*(..))"     id="log_service"/>
    <aop:before pointcut-ref="log_service" method="doBefore"/>

    匹配表达式改为匹配dao 层,而+是表示"以及子类",上述expression 的意思就是匹配 dao层的所有类以及子类的所有方法.

    现在是所有方法都会被切入,例如在调用 new B().aa() 这个方法,只会切入service 层,没有切入dao层了.

    但是问题是例如 B class 中的b() 方法,会重复调用父类 a(),这个a 也会不停的被切入.

    我希望的是,只有在service 层调用时才会被切入,而希望service 方法内的父级方法不被切入的,只切入service 层就好.

    再改成如下:

     <aop:pointcut expression="execution(* com.skyline.dao.*+.*(..)) and  !execution(* com.skyline.dao.*.*(..))"      id="log_service"/>
    <aop:before pointcut-ref="log_service" method="doBefore"/>

    想要排除dao层的方法,只切入子类方法就好.但是实际是父类dao层的类方法没有被切入,继承的子类的方法也没有切入,和最开始只切service 层的效果是一样了.

    就是说不切入父类,就不能切入子类......

    最后......泪奔....还是没有找到满意的方法...

  • 相关阅读:
    Python之模块
    Python之request模块-基础用法
    Linux小知识点
    python之pip安装软件包常用命令
    windows设置多个JDK环境
    window配合虚拟机VMware搭建虚拟ubuntu服务器入坑集锦
    Linux服务器相关信息查询
    达梦数据库
    创业公司如何快速构建高效的监控系统?
    干货分享:智慧工厂时代下大数据 + 智能的深度实践
  • 原文地址:https://www.cnblogs.com/predisw/p/4792297.html
Copyright © 2011-2022 走看看