SpringAop如何通过某个子类切父类

 更新时间:2021年11月24日 14:40:02   作者:zxx3536  
这篇文章主要介绍了SpringAop如何通过某个子类切父类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringAop通过某个子类切父类

伪代码如下

package com.zjy;
public abstract class A{
 public void a(){
  system.out.printlin("【a】方法被调用");
 }
}
package com.zjy;
public class B extends A{
 public void b(){
  system.out.printlin("【b】方法被调用");
 }
}
package com.zjy;
public class C extends A{
 public void c(){
  system.out.printlin("【c】方法被调用");
 }
}
package com.zjy;
public class D extends A{
 public void d(){d
  system.out.printlin("【d】方法被调用");
 }
}

要求如下,我们想要在代码通过B类使用a方法时候进行切面增强,通过其他类进行使用时,都不进行增强

within 和 execution的精确到类均不能对父类方法进行增强

正确方法1

 @Before("execution(* com.zjy.*.*(..))")
    public void dealOtherServicePointcut(JoinPoint joinPoint) {
        Object aThis = joinPoint.getThis();
        if((aThis instanceof B )){
            String name = joinPoint.getSignature().getName();
            log.info("进入前置方法****************************************************["+name+"]");
        }
    }

方法1是使用com.zjy包下的所有子类进行筛选,将类进行模糊匹配

正确方法2

 @Before("execution(* com.zjy..*.*(..))")
    public void dealOtherServicePointcut(JoinPoint joinPoint) {
        Object aThis = joinPoint.getThis();
        if((aThis instanceof B )){
            String name = joinPoint.getSignature().getName();
            log.info("进入前置方法****************************************************["+name+"]");
        }
    }

方法2是使用com.zjy包下的所有类以及下级包下的类,进行筛选,将类进行模糊匹配。

注意:

1.要使用instanceof关键字进行类的过滤,否则其他类也会进行增强。

2.无需考虑在增强时类需要多次代理,因为在AOP增强时只会生成一个代理类,并且大多数的类都会有代理类的生成,所以无需考虑(将没必要的类也进行了代理,后续需要使用instanceof进行判断对性能的降低)。

3.within 和 execution的精确到类均不能对父类方法进行增强

SpringAOP会忽略从父类继承的方法

在项目中,我想拦截所有的dao类,结构如下:

dao
   ---| generic
            ---| GenericDao
   ---| GoodsDao
   ---| SupermarketDao
   ---| UserDao

下面的三个dao 继承自 统一的父类(GenericDao),在beans.xml中,我只拦截了下面的三个子类,beans.xml中的部分代码如下:

<aop:aspect id="myAspect" ref="loggerAop">
   <aop:pointcut id="daoPointcut" expression="execution(* com.shop.jn.dao.*.*(..))" />
   <aop:around pointcut-ref="daoPointcut" method="around" />
  </aop:aspect>

结果从GenericDao 中继承下来的方法都没有被aop 拦截到。

如何解决这个问题呢?

让切面也匹配父类(同时匹配父类和子类),修改如下:

<aop:aspect id="myAspect" ref="loggerAop">
           <aop:pointcut id="daoPointcut" expression="execution(* com.shop.jn.dao..*.*(..))" />
           <aop:around pointcut-ref="daoPointcut" method="around" />
       </aop:aspect>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一次线上websocket返回400问题排查的实战记录

    一次线上websocket返回400问题排查的实战记录

    最近项目中有端对端通信场景,实时性要求较高,考虑后选用了websocket 这一通信协议,下面这篇文章主要给大家介绍了一次线上websocket返回400问题排查的实战记录,需要的朋友可以参考下
    2022-04-04
  • Spring Cloud Stream整合RocketMQ的搭建方法

    Spring Cloud Stream整合RocketMQ的搭建方法

    本文介绍了如何使用SpringCloudStream整合RocketMQ进行消息传递,SpringCloudStream是一个用于构建与共享消息系统连接的框架,支持持久pub/sub语义和消费者组,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Spring Security实现基于角色的访问控制框架

    Spring Security实现基于角色的访问控制框架

    Spring Security是一个功能强大的安全框架,提供了基于角色的访问控制、身份验证、授权等安全功能,可轻松保护Web应用程序的安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • elasticsearch的灵魂唯一master选举机制原理分析

    elasticsearch的灵魂唯一master选举机制原理分析

    这篇文章主要为大家介绍了elasticsearch的灵魂唯一master选举机制原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • IDEA版最新MyBatis程序配置教程详解

    IDEA版最新MyBatis程序配置教程详解

    这篇文章主要介绍了IDEA版最新MyBatis程序配置教程详解,需要的朋友可以参考下
    2020-07-07
  • swagger中如何给请求添加header

    swagger中如何给请求添加header

    这篇文章主要介绍了swagger中如何给请求添加header,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 详解SpringBoot简化配置分析总结

    详解SpringBoot简化配置分析总结

    这篇文章主要介绍了详解SpringBoot简化配置分析总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java如何在Map中存放重复key

    Java如何在Map中存放重复key

    这篇文章主要介绍了Java如何在Map中存放重复key,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • java线程本地变量ThreadLocal详解

    java线程本地变量ThreadLocal详解

    ThreadLocal则为每一个线程提供了一个变量副本,从而隔离了多个线程访问数据的冲突,ThreadLocal提供了线程安全的对象封装,下面我们就来详细了解一下吧
    2019-06-06
  • Java中Collections.sort的使用

    Java中Collections.sort的使用

    本文主要介绍了Java中Collections.sort的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论