前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解Spring-之-源码剖析AOP(注解方式一)

深入理解Spring-之-源码剖析AOP(注解方式一)

作者头像
用户5224393
发布2019-08-13 15:01:21
3740
发布2019-08-13 15:01:21
举报
文章被收录于专栏:Java研发军团Java研发军团

作者:莫那鲁道

链接:http://thinkinjava.cn

引言

上一篇文章我们从XML 配置文件的方式剖析了AOP的源码,我们也说了,虽然现在用XML配置的几乎没有了,但作为学习的例子,XML配置仍然是我们理解Spring AOP 的一个绝好的样本。

但作为一个由追求的程序员,我们天天使用的注解方式的AOP 肯定也是要去看看到底是如何实现的。现在有了之前阅读 XML 配置的源码的基础,今天我们来阅读注解方式的源码也变得轻松起来。

还记得我们之前说过,XML 配置的AOP是使用 ProxyFactoryBean ,实现了 FactoryBean的接口,而FactoryBean是Spring特意留给开发者们扩展的接口。

而Spring 留给开发者们不止一个扩展接口,比如 BeanPostProcess 接口,实现着接口就可以在每个Bean的生成前后做一些增强或自定义(具体Spring 留给我们有哪些扩展接口,楼主有机会将会再写一篇文章解析)。

接下来就要好好讲讲我们上篇文章漏讲的接口设计。这是我们理解 AOP 的基础。

先从 ProxyFactoryBean 讲起,这个熟悉的哥们。

1. ProxyFactoryBean 类结构

1.1 ProxyCreatorSupport 类结构图

它继承了 ProxyCreatorSupport 这个类,这个类很重要,我们看看该类结构

该类有2个重要的方法,分别是获取代理工厂,创建代理。那么代理工厂是什么呢?

AopProxyFactory ,是个接口,只定义了一个方法:AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException, 并且该接口目前只有一个默认实现类:DefaultAopProxyFactory。

该类主要重写了接口方法 createAopProxy, 内部逻辑是根据给定的类配置来创建不同的代理 AopProxy,那么 AopProxy 是什么呢?

就是真正创建代理的工厂,他是一个接口,有3个实现:

1.2 AopProxy 接口

1.3 AopProxy 继承结构

从名字上可以看出来,一个是 JDK 动态代理,一个是 Cglib 代理,ObjenesisCglibAopProxy 扩展了它的父类 CglibAopProxy,在 DefaultAopProxyFactory 的实现里,使用的就是 ObjenesisCglibAopProxy 来实现 Cglib 的代理。他们分别实现了自己的getProxy 方法用以创建代理。我们看看这两个类的继承结构:

1.4 JdkDynamicAopProxy 继承结构

1.5 CglibAopProxy 继承结构没什么,主要是众多内部类

可以看到哟非常多的内部类,这些内部类是为了实现了 Cglib 的各种回调而实现的。主要实现了 MethodInterceptor 接口, Callback 接口,Joinpoint 接口,Invocation 接口等待,总之是实现了Spring 的 cglib 模块的各种接口。

说了那么多,我们回来看看 ProxyCreatorSupport ,下面是 ProxyCreatorSupport 的继承结构

2. ProxyCreatorSupport 类继承图

该类有3个子类, 其中就有一个我们熟悉的 ProxyFactoryBean,该类实现了我们熟悉的 FactoryBean,还有一个可以获取容器内Bean的 BeanFactoyAware 接口。

第二个是陌生的 AspectJProxyFactory 类,该类是用于集成 Spring 和 AspectJ 的。而最后一个类ProxyFactory 就是我们今天的主角,Spring 的类注释说:用于编程使用的AOP代理,而不是在bean工厂中通过声明式设置。

这个类提供了一种简单的方法,可以在定制的用户代码中获取和配置AOP代理实例,大概意思就是通过编程的方式获取Bean 代理吧,而不是通过配置文件的方式。我们今天就可以见识到。

由于篇幅较长,不利于阅读,今天就先整理到这里。

小编正在筹备送书活动,书名为:spring实战第四版,粉丝们觉得还不错的请给个赞,小编好筹备。

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java研发军团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 ProxyCreatorSupport 类结构图
  • 1.2 AopProxy 接口
  • 1.3 AopProxy 继承结构
  • 1.4 JdkDynamicAopProxy 继承结构
  • 1.5 CglibAopProxy 继承结构没什么,主要是众多内部类
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档