Spring 揭秘 12.1
有关公开当前调用的代理对象的探讨
同一个对象内的嵌套方法调用 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相关推荐
- 《Spring揭秘》读书笔记 2:Spring AOP
7 一起来看AOP 2009年8月,<一起来看流星雨>开播. 2009年9月,<Spring揭秘>出版. 7.1 AOP核心概念 AOP AOP全称为Aspect-Orient ...
- Spring揭秘 读书笔记 三 bean的scope与FactoryBean
本书可作为王富强所著<<Spring揭秘>>一书的读书笔记 第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...
- spring学习12 -Spring 框架模块以及面试常见问题注解等
以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...
- 【Spring】12、Spring Security 四种使用方式
spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...
- 《Spring揭秘》——IOC梳理2(容器启动,bean生命周期)
IoC容器背后的秘密 主要分为两个阶段:容器启动阶段.Bean实例化阶段. 容器启动阶段: 容器需要依赖某些工具类(BeanDefinitionReader)对加载的Configuration Met ...
- spring揭秘_被问到了! Spring 和 Spring Boot 之间到底有啥区别?
相信很多小伙伴和我一样,常用Spring 和Spring Boot 但是就是没有研究二者之间到底有什么区别? 今天就来大揭秘 ↓ 概述 对于 Spring和 SpringBoot到底有什么区别,我听到 ...
- 手撸Spring系列12:MyBatis(源码篇)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- Spring揭秘--寻找遗失的web.xml
今天我们来放松下心情,不聊分布式,云原生,来聊一聊初学者接触的最多的 java web 基础.几乎所有人都是从 servlet,jsp,filter 开始编写自己的第一个 hello world 工程 ...
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
本文是在上一篇博文的基础之上,通过继承HibernateDaoSupport调用hibernateTemplate类,只要将UserDaoImpl.java改为继承HibernateDaoSuppor ...
- 《spring揭秘》读书笔记三
bean的scope 1. singleton, scope默认值为singleton spring容器中 scope='singleton'与单例模式不是一个意思.标记为singleton的bean ...
最新文章
- Python编程专属骚技巧1
- html5求6的阶乘,.net 求数的阶乘
- php redis 队列抢红包_php+redis实现消息队列
- 微擎写Android接口json,【微擎教程】getLocation需要在app.json中声明permission字段
- Online Judge系统常见返回信息分析
- Scala 基础 —— String(StringOps)、tuple、Range
- 红旗H5车机安装软件教程
- DDD领域驱动(四)——之领域建模
- linux 内存碎片信息查看
- 【计算机】数据结构-严蔚敏/清华大学P1
- 关于计算机网络海明Hamming Code校验码, CRC及奇偶码校验
- html 怎么设置延时,javascript如何设置延时执行?
- ThreadLocal源码解析2.ThreadLocalMap
- 阿兰·麦席森·图灵 介绍
- discuz点击会员名字默认进入个人空间首页
- 国际经济合作知识点归纳
- alpa开发阶段团队贡献分
- GPU虚拟化之硬件纵横
- 【Paper Note】基于情感分析和关系网络的影视产品评论数据文本挖掘研究
- RTD热电阻/TC热电偶