AOP静态代理与动态代理
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方法等描述的方法是不能被代理的
AOP的一些场景应用;
AOP用来封装横切关注点,具体可以在下面的场景中使用:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
总结
代理模式 对我们的业务逻辑代码实现增强 (事务、日志、 权限控制)
代理模式有那些种: 静态代理 和动态代理
动态代理: JDK 动态 代理和 cglib 动态代理
JDK 动态代理 必须依赖接口、cglib 面向类代理
判断被代理的类是否有实现接口、如果实现了接口就采用JDK 动态代理、 没有实现接口就是cglib