Spring Aop: 关于继承和execution target this @annotation

摘要:
1.多态target指通过这个对象调用的方法(匹配标识对象的所有方法)getMethod()this指调用这个对象的方法 (匹配标识对象实现的方法)    getDeclaredMethod()target/this匹配类及其子类2.execution(*com.dao.BaseDao.*(..))&&target(com.dao.impl.UserDaoImpl)通过UserDaoImpl对象调

1.多态

target指通过这个对象调用的方法 (匹配标识对象的所有方法) getMethod()

this指调用这个对象的方法 (匹配标识对象实现的方法)    getDeclaredMethod()

target/this匹配类及其子类

2.

execution(* com.dao.BaseDao.*(..)) && target(com.dao.impl.UserDaoImpl)

通过UserDaoImpl对象调用<继承><重写><实现>自BaseDao的方法, 会被AOP增强; 如果是通过DeptDaoImpl调用的BaseDao方法就不会被AOP增强.

execution(* com.dao.*.*(..)) && this(com.dao.impl.UserDao)

通过UserDaoImpl对象调用<重写><实现>自BaseDao的方法, 会被AOP增强; 如果UserDaoImpl并没有Override-BaseDao的方法, 那么即使通过UserDaoImpl调用了BaseDao的方法也不会被Aop增强.

如果UserDaoImpl未重写, 但UserDaoImpl的子类UserDaoImplSan重写了, 那么UserDaoImplSan的这个方法会被Aop代理

this语义要强于target

3.关于继承

execution() 匹配父类的某个方法, 那么aop对其子类的这个方法都有效, 即使子类重写了父类的方法扔有效

execution() 匹配子类的某个方法, 如果这个方法是继承自父类的, 那么只有当子类重写了父类的这个方法, aop才对这个方法有效; 否则无效(即使execution不是通过通配符, 而是明确指定子类某个继承方法, 也是无效的)

4.从上面可以看出, target和this主要是用加强某个已存在的pointcut, 如果不考虑复用, 对每个切入点都写详细的execution是可以避免使用target 和 this的

5.@annotation

@annotation表示匹配有这个注解的方法

关键:如何获得注解的值

1.对于直接声明并使用的切入点, 如@Before("@annotation(annoParam)"), 可以在增强方法的参数中直接声明, spring会自动注入

@Before("@annotation(annoParam)")  //这里是参数名

public void myAdvice(MyAnno annoParam){}

2.对于通过@Pointcut声明, 或者和execution复合声明的切入点, 如@Before("execution(xxx) && @annotation(MyAnno)), 要通过JoinPoint获得

@Before("myPoint()")

  public void myAdvice(JoinPoint point){

    Signature signature = point.getSignature();

    Class clazz = signature.getDeclaringType(); //获得被代理的类

    MethodSignature methodSignature = (MethodSignature)signature;

    Method method = methodSignature.getMethod();

    MyAnno myAnno = method.getAnnotation(MyAnno.class);

  }

//直接使用@annotation(X) X是增强方法的参数名

免责声明:文章转载自《Spring Aop: 关于继承和execution target this @annotation》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇对JS中继承的思考编写构建自己的gem包指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)使用CruiseControl+SVN+ANT实现持续集成之二

1. 环境搭建1.1. 下载及目录介绍 从官方站点http://cruisecontrol.sourceforge.net/download.html下载一份最新的 CC 压缩包,最新的版本号为2.8.4 下载了cruisecontrol-bin-2.8.4.zip 直接解压到E盘下,文件结构如下图: apache-ant-1.7.0:CC中使用...

IPTABLES详解(10):IPTABLES自定义链

前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。 iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,...

java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)

一、分模块项目打包失败    情况:项目是分模块创建的,一些公共的方法是单独的一个模块common,其他模块依赖于此模块,poom依赖已经添加了,项目可以正常运行,但使用maven打包时出现了问题:找不到依赖的jar包;    解决历程   1. 首先对项目common依次进行clean、install。(注意:package和install是有区别的,p...

JSON中单引号的处理

在Json字符串中如果有单引号,用eval转化的时候会报错。解决方法: 1、C#代码        [DebuggerStepThrough]        public static string ToJson(this object target)        {            var serializer = new JavaScriptS...

ubuntu 18.04, 编译运行ORB_SLAM3, 遇到错误Pangolin X11: Unable to retrieve framebuffer options。

当前问题 遇到错误Pangolin X11: Unable to retrieve framebuffer options。操作系统是ubuntu 18.04,物理机,不是虚拟机. 按报错Pangolin X11: Unable to retrieve framebuffer options ,修改components/pango_windowing/sr...

YII2框架集成go!aop

AOP实践:YII2框架本身拥有一个功能,叫做行为.它可以动态的为当前的类附加额外的功能,但这种功能在代码层级结构是静态的,有侵入性的。下面以YII2框架集成go!aop库为例,介绍在YII2中如何实现AOP编程.(go!aop简介,可以参考go!aop的官网.)由于YII框架拥有自己的类加载器,所在集成go!aop的时候,不能正常的工作,所以要将其禁用掉...