| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 阿里四面:你知道Spring AOP创建Proxy的过程吗? -> 正文阅读 |
|
[Java知识库]阿里四面:你知道Spring AOP创建Proxy的过程吗? |
Spring在程序运行期,就能帮助我们把切面中的代码织入Bean的方法内,让开发者能无感知地在容器对象方法前后随心添加相应处理逻辑,所以AOP其实就是个代理模式。 1 案例某游戏系统,含负责点券充值的类CouponService,它含有一个充值方法deposit(): 由于微信支付是第三方接口,需记录接口调用时间。 2 源码解析-创建代理对象的过程
这要从Spring AOP增强对象的过程来看。 AOP的底层是动态代理,创建代理的方式:
针对非Spring Boot程序,除了添加相关AOP依赖项外,还会使用 @EnableAspectJAutoProxy 开启AOP功能。
2.1 创建代理对象的时机创建一个Bean时。 创建的关键工作由AnnotationAwareAspectJAutoProxyCreator,一种BeanPostProcessor完成。 AbstractAutoProxyCreatorpostProcessAfterInitialization
wrapIfNecessary2.2 createProxy创建代理对象的关键:
经过这样一个过程,一个代理对象就被创建出来了。我们从Spring中获取到的对象都是这个代理对象,所以具有AOP功能。而之前直接使用this引用到的只是一个普通对象,自然也就没办法实现AOP的功能了。 3 修正经过分析可知,只有引用的是被 那得怎么处理对象,才具备这样的条件? 被@Autowired注解通过 @Autowired,在类的内部,自己引用自己: 直接从AopContext获取当前ProxyAopContext,就是通过一个ThreadLocal来将Proxy和线程绑定起来,这样就可以随时拿出当前线程绑定的Proxy。 使用该方案有个前提,需要在 @EnableAspectJAutoProxy 加配置项 exposeProxy = true ,表示将代理对象放入到ThreadLocal,这才可以直接通过
获取到,否则报错: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 18:33:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |