Spring的AOP实现采用了两种方式:
使用CGLib动态代理
CGLib是通过继承自要代理的类,形成子类,然后将原有方法进行
增强。
Spring考虑到如果只仅仅使用JDK动态代理,用户在没有建立接口的情
况下,就无法实现代理模式了。那么此时就会切换到CGLib实现。
主要是以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)方法
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 //自己定义的代理类
代理对象执行方法
推荐阅读: