Spring AOP---切面编程基础(动态代理)
目标对象target:要被代理的对象
连接点:连接被代理对象中所有的方法.
切入点:被代理对象中指定要增强的方法
通知:通知对切入点做的具体操作叫做通知
切面:切入点+通知
织入:从被代理对象到代理对象的过程叫织入
代理:一个类被AOP增强后产生的对象
Spring aop底层实现的两种(jdk(必须实现接口的动态代理)和cglib(即可实现接口,也可以不实现))
AOP分为静态AOP和动态AOP。静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。动态AOP是指将切面代码进行动态织入实现的AOP。Spring的AOP为动态AOP,实现的技术为: JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术)
Jdk的动态代理
在运行时,通过jvm内部动态的通过类加载器来生成class字节码对象实现,jdk动态代理,只针对于接口操作.
//创始一个使用jdk的proxy完成动态代理工具
publicclass JDKProxyFactory implements InvocationHandler {
private Object target;
public JDKProxyFactory(Object target) {
this.target = target;
}
// 创建代理对象
public Object createProxy() {
// 使用Proxy完成代理对象创建
// 1.得到目标对象的ClassLoader
ClassLoader loader =target.getClass().getClassLoader();
// 2.得到目标对象的实现接口的Class[]
Class[] interfaces =target.getClass().getInterfaces();
// 3.第三个参数需要一个实现了InvocationHandler接口的对象
returnProxy.newProxyInstance(loader, interfaces, this);
}
// 在代理实例上处理方法调用并返回结果。
// 参数1 就是代理对象,一般不使用
// 参数2它调用的方法的Method对象
// 参数3调用的方法的参数
@Override
public Object invoke(Object proxy, Methodmethod, Object[] args) throws Throwable {
// 功能增强操作
System.out.println("日志操作....");
return method.invoke(target,args);
}
}
Cglib动态代理
个人觉得和proxy的方式类似
//1,创建enhance对象
Enhancer enhancer = newEnhancer();
//2,相当于是反射该类
enhancer.setSuperclass(target.getClass());
//设置回调函数,相当于InvocationHandler,中的inoke方法enhancer.setCallback(this);
实现了MethodInterceptor接口
使用其中的intercept方法返回一个方法