有关公开当前调用的代理对象的探讨

同一个对象内的嵌套方法调用 Spring AOP 拦截失效

问题经典示例:
Spring 事务失效

书中示例



原因分析

归根结底,是Spring AOP实现机制造成的。其采用代理模式实现AOP。具体的横切逻辑,会被动态添加到代理对象中。
一般代理对象与目标对象方法的调用时序:

在代理对象方法中,不管你如何添加横切逻辑,最终都需要调用目标对象上的同一方法,来执行最初所定义的方法逻辑。
而 同一个对象内的嵌套方法调用 拦截失效

代理对象的method1 方法,最终会调用目标对象上的method1;而此时,method 调用method2 时,它调用的是 TargetObject 上的method2 ,而不是ProxyObject上的method2 。要知道,针对method2 的横切逻辑,只织入到了ProxyObject 上的method2 方法中。

解决方案

当目标对象,依赖于其他对象时,可以通过为目标对象,注入依赖对象的代理对象,来解决拦截的问题(日常编码中以及Spring AOP 实现中,大多数都是此情况)。

当目标对象依赖于自身时,也可以将目标对象的代理对象 公开给它,只要让它直接调用 自身的代理对象上的响应方法,就可以解决没有被拦截的问题

Spring AOP 提供了AopContext 来公开(暴露)当前目标对象的代理对象。AopContext.currentProxy() 就可以取得当前目标对象所对应的代理对象。

注意

实际上,这种情况的出现,仅仅是因为Spring AOP采用的是代理机制实现。而并非AOP理念本身的缺陷。

Spring 揭秘 12.1相关推荐

  1. 《Spring揭秘》读书笔记 2:Spring AOP

    7 一起来看AOP 2009年8月,<一起来看流星雨>开播. 2009年9月,<Spring揭秘>出版. 7.1 AOP核心概念 AOP AOP全称为Aspect-Orient ...

  2. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  3. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

  4. 【Spring】12、Spring Security 四种使用方式

    spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...

  5. 《Spring揭秘》——IOC梳理2(容器启动,bean生命周期)

    IoC容器背后的秘密 主要分为两个阶段:容器启动阶段.Bean实例化阶段. 容器启动阶段: 容器需要依赖某些工具类(BeanDefinitionReader)对加载的Configuration Met ...

  6. spring揭秘_被问到了! Spring 和 Spring Boot 之间到底有啥区别?

    相信很多小伙伴和我一样,常用Spring 和Spring Boot 但是就是没有研究二者之间到底有什么区别? 今天就来大揭秘 ↓ 概述 对于 Spring和 SpringBoot到底有什么区别,我听到 ...

  7. 手撸Spring系列12:MyBatis(源码篇)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  8. Spring揭秘--寻找遗失的web.xml

    今天我们来放松下心情,不聊分布式,云原生,来聊一聊初学者接触的最多的 java web 基础.几乎所有人都是从 servlet,jsp,filter 开始编写自己的第一个 hello world 工程 ...

  9. spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)

    本文是在上一篇博文的基础之上,通过继承HibernateDaoSupport调用hibernateTemplate类,只要将UserDaoImpl.java改为继承HibernateDaoSuppor ...

  10. 《spring揭秘》读书笔记三

    bean的scope 1. singleton, scope默认值为singleton spring容器中 scope='singleton'与单例模式不是一个意思.标记为singleton的bean ...

最新文章

  1. Python编程专属骚技巧1
  2. html5求6的阶乘,.net 求数的阶乘
  3. php redis 队列抢红包_php+redis实现消息队列
  4. 微擎写Android接口json,【微擎教程】getLocation需要在app.json中声明permission字段
  5. Online Judge系统常见返回信息分析
  6. Scala 基础 —— String(StringOps)、tuple、Range
  7. 红旗H5车机安装软件教程
  8. DDD领域驱动(四)——之领域建模
  9. linux 内存碎片信息查看
  10. 【计算机】数据结构-严蔚敏/清华大学P1
  11. 关于计算机网络海明Hamming Code校验码, CRC及奇偶码校验
  12. html 怎么设置延时,javascript如何设置延时执行?
  13. ThreadLocal源码解析2.ThreadLocalMap
  14. 阿兰·麦席森·图灵 介绍
  15. discuz点击会员名字默认进入个人空间首页
  16. 国际经济合作知识点归纳
  17. alpa开发阶段团队贡献分
  18. GPU虚拟化之硬件纵横
  19. 【Paper Note】基于情感分析和关系网络的影视产品评论数据文本挖掘研究
  20. RTD热电阻/TC热电偶

热门文章

  1. SQL如何删除重复数据
  2. 沟通的重要工具——乔哈里视窗
  3. 在线代码图片生成工具carbon
  4. 啊哈c语言第四章 pdf,啊哈!算法 PDF扫描版[73MB]
  5. 如何做一个基于JAVA的新闻管理系统毕业设计毕设作品(springboot框架)
  6. USBVIEW(带已分配带宽显示功能)-电脑圈圈
  7. Java生成随机常用汉字或姓名
  8. extjs4.0视频教程
  9. java通讯录管理系统答辩_java版通讯录管理系统
  10. NLP中文常用停用词表