SpringAop如何通过某个子类切父类
目录
- SpringAop通过某个子类切父类
- 正确方法1
- 正确方法2
- 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(){dsystem.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下面的三个dao 继承自 统一的父类(GenericDao),在beans.xml中,我只拦截了下面的三个子类,beans.xml中的部分代码如下:
---| generic
---| GenericDao
---| GoodsDao
---| SupermarketDao
---| UserDao
结果从GenericDao 中继承下来的方法都没有被aop 拦截到。
如何解决这个问题呢?
让切面也匹配父类(同时匹配父类和子类),修改如下:
【SpringAop如何通过某个子类切父类】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- gitlab|gitlab 通过备份还原 admin/runner 500 Internal Server Error
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- java中如何实现重建二叉树
- Linux下面如何查看tomcat已经使用多少线程
- thinkphp|thinkphp 3.2 如何调用第三方类库