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

引言

上一篇文章我们从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 代理吧,而不是通过配置文件的方式。我们今天就可以见识到。

猜你喜欢

转载自blog.csdn.net/ghostxbh/article/details/81288331