引言

 

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

 

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

 

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

 

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

 

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

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

 

1. ProxyFactoryBean 类结构

 

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

  1.1 ProxyCreatorSupport  类结构图

 

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

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

 

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

 

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

 

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

 

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

 

1.2  AopProxy  接口

 

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

  1.3 AopProxy  继承结构

 

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

 

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

 

1.4 JdkDynamicAopProxy 继承结构

 

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

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

 

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

 

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

 

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

 

2. ProxyCreatorSupport   类继承图

 

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

 

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

 

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

 

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