Spring AOP的实现原理

时间:2022-4-14    作者:老大夫    分类: JAVA


AOP的实现原理

Spring的AOP实现采用了两种方式:

  1. 使用JDK动态代理
    JDK动态代理,是通过接口的方法列表截取实现的。
  2. 使用CGLib动态代理
    CGLib是通过继承自要代理的类,形成子类,然后将原有方法进行
    增强。
    Spring考虑到如果只仅仅使用JDK动态代理,用户在没有建立接口的情
    况下,就无法实现代理模式了。那么此时就会切换到CGLib实现。

    JDK动态代理

    主要是以Proxy类为主。

    实现动态代理需4步骤:

1)创建一个实现接口InvocationHandler的代理类,它必须实现invoke方法。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* UserService的代理类
*/
public class MyProxy implements InvocationHandler {
    //要代理的对象
    private Object target ;
    //构造方法就要传入被代理对象
    public MyProxy(Object target) {this.target = target ;}

    //调用代理目标的方法
    @Override
    public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
    //这里可以添加 AOP增强通知
    System.out.println("开启事务");
    Object o = null;
    try {
    //方法调用,执行target 的方法
    o = method.invoke(target, args);
    System.out.println("事务提交");
    } catch (Exception e) {
    e.printStackTrace();
    System.out.println("事务回滚");
    } finally {
    System.out.println("关闭资源");
    }
    System.out.println("日志");
    return o;
    }
}

代理类一定要实现一个叫做InvocationHandler的接口,
其中包含一个public Object invoke(Object proxy, Method method,Object[] args)方法

  • Object proxy:指代理类
  • Method method:是被代理的方法
  • Object[] args:该方法的参数数组

2) 通过Proxy的静态方法newProxyInstance创建一个代理
3) 创建被代理的类以及接口
4) 通过代理调用方法

public class Client2 {
    public static void main(String[] args) {
        //要被代理的对象
        ProviderService providerService = new
                ProviderServiceImpl() ;
        //将要被代理的对象传给proxy代理类
        MyProxy myProxy = new MyProxy(providerService);
        //实现代理对象的创建
        providerService = (ProviderService)
 Proxy.newProxyInstance(providerService.getClass().getClassLoader(),
                        providerService.getClass().getInterfaces(),
                        myProxy);
        //代理对象调用list
        providerService.list();
    }
}

先创建出来一个要被代理的对象
把要被代理的对象,代理类
创建出代理对象

创建代理对象需要用到 Proxy.newProxyInstance方法,其中三个参数
1. object.getClass().getClassLoader(),    //被代理对象的加载器
2. object.getClass().getInterfaces(),     //被代理对象的接口
3. myProxy                                //自己定义的代理类

代理对象执行方法

标签: spring AOP


扫描二维码,在手机上阅读

推荐阅读: