AOP:面向切面的编程
AOP的底层实现就是通过动态代理来做到的。
动态代理
在代理模式基础上发展的,它不在是对单一的类型进行代理,而是可以对任意的一个实现了接口的类的对象做代理。
动态代理实现
两种方式:
1.通过jdk中提供的Proxy类来实现
这种方式要求,被代理类必须实现接口,即只能为接口做代理.
2.通过cglib来实现,它不要求实现接口。
第一种方式的代码实现:
Proxy类中有一个方法newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
参数:
loader: 要求,传递的是被代理类的类加载器ClassLoader
类加载器怎样获取:
得到其Class对象,在Class类中提供一个方法getClassLoader();
interfaces: 要求:得到被代理对象所实现的接口的所有Class对象。
怎样获取所有实现接口的Class对象?
得到其Class对象,在Class类中提供一个方法 getInterfaces();它返回的是Class[],就代表所实现接口的所有Class对象。
h: 它的类型是InvocationHandler,这是一个接口。
InvocationHandler 是代理实例的调用处理程序 实现的接口。
InvocationHandler**接口中有一个方法**invoke;
参数 proxy 就是代理对象
参数 method 就是调用方法
参数 args 就是调用的方法的参数
返回值,就是真实行为执行后返回的结果,会传递给代理对象调用的方法.
public Object invoke(Object proxy, Method method, Object[] args);