定义切面注解
|
|
代理框架
Proxy接口
代理接口Proxy
,定义了一个doProxy
方法,传入一个ProxyChain
,用于执行“链式代理”。
所谓链式代理就是,将多个代理串起来,一个个去执行,执行顺序取决于添加到链上的先后顺序。
同一个目标对象,可能会被多个切面代理,因而采用代理链的方式。
|
|
ProxyChain
ProxyChain
类中定义了一系列的成员变量,包括 targetClass(目标类)、targetObject(目标对象)、targetMethod(目标方法)、methodProxy(方法代理类)、methodParams(方法参数)、proxyList(代理列表)、proxyIndex(代理索引)。
methodProxy
是 CGLib 提供的一个方法代理对象。
proxyIndex
充当代理对象的计数器,若未达到proxyList
的上限,则从proxyList
中取出Proxy对象,并调用其doProxy()
方法,在Proxy接口的实现中会提供相应的横切逻辑,并调用doProxyChain()
方法,随后将再次调用当前ProxyChain对象的doProxyChain()
方法,直到proxyIndex
达到proxyList
的上限为止,最后调用methodProxy
的invokeSuper()
方法,执行目标对象的业务逻辑。
|
|
ProxyManager
ProxyManager
的作用是:提供一个创建代理对象的方法,输入一个目标类和一组Proxy接口实现,输出一个代理对象。
借助CGLib提供的
MethodInterceptor
和Enhancer
完成代理对象的创建。
|
|
AbstractProxy
抽象类AbstractProxy
实现了接口Proxy
,并提供了一系列的钩子方法,这些方法可以在其子类中选择性地实现。
加载AOP框架
通过AopHelper
获取所有的目标类及其被拦截的切面类实例,并通过ProxyManager
创建目标类的代理对象,最后放入Bean Map中。
AopHelper
要在IocHelper
之前加载,因为首先要通过AopHelper
获取代理对象,然后才能通过IocHepler
进行依赖注入。
|
|