使用动态代理实现持久化更新记录的切面

 (一)首先介绍一下java动态代理。在java动态代理机制中有两个重要的接口和类。

        接口是:InvocationHandler。按照java api 的解释:每一个动态代理类都会有一个实现该接口的handler,当代理类的方法被调用时这个方法的就会转发为InvocationHandler 的invoke方法调用。invoke方法定义:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable

三个参数的具体意义为:

proxy:  所代理的那个真实对象

method:  所要调用真实对象的某个方法的Method对象

args:  调用真实对象某个方法时接受的参数

        类是:Proxy。按照java api的解释:该类提供一个创建动态代理类及实例的方法newProxyInstance,它是所有通过该方法创建的动态代理类的父类。newProxyInstance方法定义:

public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException

该方法的作用为:得到一个动态代理的对象。其三个参数的具体意义为:

 loader:ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

interfaces:Interface对象的数组,表示的是将要给需要代理的对象提供一组什么接口,如果提供了一组接口给 它,   那么这个代理对象就宣称实现了该接口(多态),这样就能调用这组接口中的方法了

h:InvocationHandler对象,表示的是当这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

 (二)基于动态代理实现切面

(1)定义需要代理的接口

(2)实现接口也就是需要代理的真实对象。在这个真实类里实现业务代码。

使用动态代理实现持久化更新记录的切面_第1张图片

(3) 实现 InvocationHandler创建动态代理类handler。在构造方法中传入真实对象。当真实对象被代理的方法执行是会转发到该handler的invoke方法。

使用动态代理实现持久化更新记录的切面_第2张图片

invoke方法实现示例:在被代理方法调用的前后可以做一些操作,实现切面。

使用动态代理实现持久化更新记录的切面_第3张图片

(4)运用代理实现切面类

使用动态代理实现持久化更新记录的切面_第4张图片

    以上即基于动态代理实现基本切面的过程和原理。

创作不易,转载请注明出处!

你可能感兴趣的:(使用动态代理实现持久化更新记录的切面)