Aop(面向切面思想,不是指Spring Aop):面向切面编程,Aop的实现分为两种,动态切面(运行期织入增强代码)和静态切面(编译器在编译期织入)。静态切面是AspectJ,Spring Aop采用动态切面,即jdk动态代理和CGLIB动态代理来实现。Spring默认是使用jdk动态代理实现Aop。
在spring的实现原理中主要关注两个方面:
- 1.动态代理对象AopProxy是如何创建的
- 2.动态代理的拦截器对象是如何完成横切面的织入的
Spring Aop 代理对象的生成
Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。下面就来分析一下如何使用JDK来生成动态代理对象。具体的生成代码放在JdkDynamicAopProxy这个类中
/**
* <ol>
* <li>获取代理类要实现的接口,除了Advised对象中配置的,还会加上SpringProxy, Advised(opaque=false)
* <li>检查上面得到的接口中有没有定义 equals或者hashcode的接口
* <li>调用Proxy.newProxyInstance创建代理对象
* </ol>
*/
public Object getProxy(ClassLoader classLoader) {
if (logger.isDebugEnabled()) {
logger.debug("Creating JDK dynamic proxy: target source is " +this.advised.getTargetSource());
}
Class[] proxiedInterfaces =AopProxyUtils.completeProxiedInterfaces(this.advised);
findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
}
该类本身实现了InvocationHandler接口和invoke方法,这个invoke方法是Proxy代理对象的回调方法,也就是说在代理对象本身在Proxy代理的接口方法被调用时,会去调用invoke方法。下面我们就来分析JdkDynamicAopProxy的invoke方法,这个回调方法完成了Aop编织实现的封装
在这里插入代码片