AOP

面相切面编程,是作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理,日志,缓存,异常等。


AOP代理分类

静态代理和动态代理


静态代理

静态代理就是AOP框架会在编译阶段将Aspect植入java字节码中,生成AOP代理类,在运行的时候,是直接运行其增强的AOP对象,因此也称为编译时增强(反编译*.class可以发现和源代码不一样);AspectJ就是典型的静态代理增强;


动态代理

动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调对方的方法;Spring AOP使用的是动态代理


Spring AOP中动态代理的分类

JDK动态代理和CGLiB动态代理


JDK动态代理

通过反射来接受被代理的类,并且要求被代理的类必须实现一个接口;

JDK动态代理的核心是InvocationHandler接口和Proxy类


CGLIB动态代理

如果目标类,没有实现接口,那么spring AOP会选择使用CGLIB来动态代理目标类;

CGLIB(Code Generation Library)是一个代码生成的类库,可以再运行时动态的生成某个类的子类;

注意CGLiB是通过集成的方式做的动态代理,因此如果某个类是final,是无法使用CGLIB动态代理的;

同理,由于是继承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的