聊聊实现AOP框架的代理模式
AOP(面向切面编程) 要达到的效果就是:在开发者不修改业务组件源代码的前提下,为这个业务组件添加某种通用功能。
AOP的实现方式
如果不在开发阶段去修改业务组件源代码,那么我们要在什么时候添加通用功能的代码呢?那就只能是在开发阶段之后,由AOP框架自动修改了源代码。
按照 AOP 框架修改源代码的时机,大致可以分为两类实现方式:
- 静态 AOP 实现:AOP 框架在编译阶段对程序代码进行修改,生成了静态的 AOP 代理类。原来业务组件源代码生成的 *.class 文件已经被改掉了,这种实现方式需要使用特定的编译器,比如 AspectJ。
- 动态 AOP 实现:AOP 框架在运行阶段动态生成代理对象,程序要通过代理对象来访问业务组件的方法,在代理对象中添加通用功能的代码,如 Spring AOP。
本文重点介绍Spring AOP 的动态代理机制,在介绍动态代理之前,我们先从代理模式说起。
代理模式
代理模式是GoF的23种经典设计模式(Design Pattern)之一,属于结构型设计模式。简单说就是:给某一个对象提供一个代理,由代理对象来控制对真实对象的访问。
这就好比单位领导有一位秘书,下属要找领导审批文件都要通过他的秘书,而领导也都通过秘书来传达他的指令,平时大家只和这个秘书打交道,秘书就相当于这位领导的代理。
代理模式:老板与下属的所有交互都由秘书代为完成,秘书就是老板的代理
代理模式角色分为 3 种:
Subject(抽象主题角色):定义代理类和真实主题的公共对外方法;
RealSubject(真实主题角色):真正实现业务逻辑的类;
Proxy(代理主题角色):用来代理和封装真实主题的类;
代理模式