Spring 中AOP 特性详解
来源:互联网 发布:渝中男性医院网络预约 编辑:程序博客网 时间:2024/06/13 08:19
Spring框架的设计理念与设计模式分析--- Spring中AOP特性详解
动态代理的实现原理
要了解 Spring的 AOP 就必须先了解的动态代理的原理,因为 AOP就是基于动态代理实现的。动态代理还要从 JDK本身说起。
在 Jdk的 java.lang.reflect包下有个 Proxy 类,它正是构造代理类的入口。这个类的结构入下:
图 16. Proxy类结构
从上图发现最后面四个是公有方法。而最后一个方法 newProxyInstance就是创建代理对象的方法。这个方法的源码如下:
清单 6. Proxy. newProxyInstance
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException {
if (h == null) {
throw new NullPointerException();
}
Class cl = getProxyClass(loader, interfaces);
try {
Constructor cons = cl.getConstructor(constructorParams);
return (Object) cons.newInstance(new Object[] { h });
} catch (NoSuchMethodException e) {
throw new InternalError(e.toString());
} catch (IllegalAccessException e) {
throw new InternalError(e.toString());
} catch (InstantiationException e) {
throw new InternalError(e.toString());
} catch (InvocationTargetException e) {
throw new InternalError(e.toString());
}
}
这个方法需要三个参数:ClassLoader,用于加载代理类的 Loader类,通常这个 Loader和被代理的类是同一个 Loader类。Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler 类中定义的唯一方法 invoke中。这在后面再详解。
下面还是看看 Proxy如何产生代理类的过程,他构造出来的代理类到底是什么样子?下面揭晓啦。
图 17.创建代理对象时序图
其实从上图中可以发现正在构造代理类的是在 ProxyGenerator的 generateProxyClass的方法中。ProxyGenerator类在 sun.misc包下,感兴趣的话可以看看他的源码。
假如有这样一个接口,如下:
清单 7. SimpleProxy类
public interface SimpleProxy {
public void simpleMethod1();
public void simpleMethod2();
}
代理来生成的类结构如下:
清单 8. $Proxy2类
public class $Proxy2 extends java.lang.reflect.Proxy implements SimpleProxy{
java.lang.reflect.Method m0;
java.lang.reflect.Method m1;
java.lang.reflect.Method m2;
java.lang.reflect.Method m3;
java.lang.reflect.Method m4;
int hashCode();
boolean equals(java.lang.Object);
java.lang.String toString();
void simpleMethod1();
void simpleMethod2();
}
这个类中的方法里面将会是调用 InvocationHandler的 invoke 方法,而每个方法也将对应一个属性变量,这个属性变量 m也将传给 invoke方法中的 Method参数。整个代理就是这样实现的。
Spring AOP如何实现
从前面代理的原理我们知道,代理的目的是调用目标方法时我们可以转而执行 InvocationHandler类的 invoke 方法,所以如何在 InvocationHandler上做文章就是 Spring实现 Aop 的关键所在。
Spring 的 Aop 实现是遵守 Aop联盟的约定。同时 Spring又扩展了它,增加了如 Pointcut、Advisor等一些接口使得更加灵活。
下面是 Jdk动态代理的类图:
图 18. Jdk动态代理的类图
上图清楚的显示了 Spring引用了 Aop Alliance定义的接口。姑且不讨论 Spring如何扩展 Aop Alliance,先看看 Spring如何实现代理类的,要实现代理类在 Spring的配置文件中通常是这样定一个 Bean的,如下:
清单 9.配置代理类 Bean
<bean id="testBeanSingleton"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>
org.springframework.aop.framework.PrototypeTargetTests$TestBean
</value>
</property>
<property name="target"><ref local="testBeanTarget"></ref> </property>
<property name="singleton"><value>true</value></property>
<property name="interceptorNames">
<list>
<value>testInterceptor</value>
<value>testInterceptor2</value>
</list>
</property>
</bean>
配置上看到要设置被代理的接口,和接口的实现类也就是目标类,以及拦截器也就在执行目标方法之前被调用,这里 Spring中定义的各种各样的拦截器,可以选择使用。
下面看看 Spring如何完成了代理以及是如何调用拦截器的。
前面提到 Spring Aop也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了 FactoryBean的 ProxyFactoryBean,FactoryBean之所以特别就在它可以让你自定义对象的创建方法。当然代理对象要通过 Proxy类来动态生成。
下面是 Spring创建的代理对象的时序图:
图 19.Spring代理对象的产生
Spring 创建了代理对象后,当你调用目标对象上的方法时,将都会被代理到 InvocationHandler类的 invoke 方法中执行,这在前面已经解释。在这里 JdkDynamicAopProxy类实现了 InvocationHandler接口。
下面再看看 Spring是如何调用拦截器的,下面是这个过程的时序图:
图 20.Spring调用拦截器
以上所说的都是 Jdk动态代理,Spring还支持一种 CGLIB类代理,感兴趣自己看吧
- Spring 中AOP 特性详解
- Spring中AOP详解
- Spring中AOP实例详解
- spring特性2-aop
- spring中AOP 注解开发示例详解
- Spring boot中使用aop详解
- Spring---Spring中AOP
- 详解Spring AOP
- Spring AOP 详解
- Spring AOP 详解
- Spring AOP 详解
- Spring AOP 详解
- Spring AOP详解
- Spring AOP 详解
- Spring AOP 详解
- Spring AOP 详解
- spring AOP详解
- Spring AOP 详解
- 红黑树类算法实现
- jsp:useBean总结
- subversion的使用总结
- SecureCRT 乱码解决
- JAVA坏境变量设置与作用
- Spring 中AOP 特性详解
- spring2.0 -Pointcut的定义
- 项目中使用SPRING AOP方式统一捕获异常
- 看完了这几个故事,你就懂了。
- 别把自己当个超人——给初级程序员的一点小小建议
- C++拷贝构造函数(深拷贝,浅拷贝)
- 8.2.1显示记录总数和当前记录号[ODBC]
- mkdir命令(建立一个目录) rmdir命令(删除一个目录) rm命令(删除文件)
- select