. Spring AOP的原理
AOP(Aspect-Oriented Programming,面向切面的编程)
AOP的原理 是使用JDK动态代理和cglib动态代理技术来实现的
1.JDK动态代理:通过实现InvocationHandlet接口,并重写里面的invoke方法,通过为proxy类指定classLoader和一组interfaces来创建动态代理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了
2. cglib的动态代理
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
import net.sf.cglib.proxy.Enhancer;
public class Client {
public static void main(String[] args) {
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(HelloServiceImlpl.class);//继承被代理类
enhancer.setCallback(new HelloMethodInterceptor());//设置回调
HelloServiceImlpl helloService=(HelloServiceImlpl) enhancer.create();//生成代理类对象
helloService.sayHello();//在调用代理类方法时会被我们实现的方法拦截器拦截
}
}
JDK动态代理具体实现原理:
1、通过实现InvocationHandlet接口创建自己的调用处理器
2、通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理
3、通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型
4、通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入
JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,
Spring通过java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。
它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
常用术语:
– 切面(Aspect):其实就是共有功能的实现。
– 通知(Advice):是切面的具体实现。
– 连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。
– 切入点(Pointcut):用于定义通知应该切入到哪些连接点上。
– 目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象
– 代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。
– 织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。
• 开源的AOP框架
---------------------
作者:Reallycold
来源:CSDN
原文:https://blog.csdn.net/reallycold/article/details/82144454
版权声明:本文为博主原创文章,转载请附上博文链接!
参考资料:
https://blog.csdn.net/reallycold/article/details/82144454