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

AOP静态代理与动态代理_第1张图片

你可能感兴趣的:(面试题,java,aop,proxy,jdk,spring)