AOP分类
- 根据静态编译时和运行时两种环境: aop可以分为静态代理和动态代理静态代理主要涉及AspectJ.动态代理主要涉及Spring AOP, CGLIB.静态代理与动态代理的区分点主要在于: aop框架能否在程序运行时动态地创建aop-代理.
1、 代理对象存在的价值主要用于拦截对真实业务对象的访问。
2、代理对象应该具有和目标对象(真实业务对象)相同的方法。
JDK动态代理
-
jdk动态代理使用jdk自带的反射机制来完成aop的动态代理, 使用jdk自带的动态代理有如下要求:
1.被代理类(我们的业务类)需要实现统一接口
2.代理类要实现reflect包里面的接口InvocationHandler
3.通过jdkProxy提供的静态方法newProxyInstance(xxx)来动态创建代理类 -
JDK动态代理缺点:
JDK动态代理要求target对象是一个接口的实现对象,假如target对象只是一个
单独的对象,并没有实现任何接口则无法实现动态代理。
可以同过CGlib动态代理实现。
CGLIB
- CGLIB的全称: Code Generation Library
翻译过来就是代码生产库, 与AspectJ的机制不一样, CGLIB可以在代码运行时动态生成某个类的子类, 因此使用CGLIB时, 我们不需要像jdk动态代理一样建立统一代理接口.
先来看一看CGLIB的使用机制
JDK动态代理和CGLIB的区别
- CGLIB使用了底层的字节码技术, 通过字节码处理框架ASM, 在程序运行时为一个类创建子类, 在子类中重写父类的方法, 为父类方法加入切面逻辑(无法代理final修饰的方法). CGLIB创建代理类的代价相对大, 但是运行切面逻辑的速度较快, 适合单例模式.
JDK动态代理使用jdk原生提供的反射机制, 位于sun.reflect包中. 代理类生成过程较快, 但切面逻辑运行速度没有CGLIB动态代理快. 而且被代理类必须基于统一接口, 存在局限性, 实际中并不常用这种方式.
#千锋逆战班,武汉java逆战1903学习笔记#