Spring AOP
关注点分离:不同的问题交给不同的部分去解决
- 面向切面编程AOP正是此种技术的体现
- 通用化功能代码的实现,对应的就是所谓的切面(Aspect)
- 业务功能代码和切面代码分开后,架构将变得高内聚低耦合
- 确保功能的完整性:切面最终需要被合并到业务中(Weave)
AOP的三种织入方式
- 编译时织入:需要特殊的Java编译器,如AspectJ
- 类加载时织入:需要特殊的Java编译器,如AspectJ和AspectWerkz
- 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单
AOP的主要名词概念
- Aspect:通用功能的代码实现
- Target:被织入Aspect的对象
- Join Point:可以作为切入点的机会,所有的方法都可以作为切入点
- Pointcut:Aspect实际被应用在的Join Point,支持正则表达式
- Adivce:类里的方法以及这个方法如何织入到目标方法的方式
- 前置通知(Before)
- 后置通知(AfterReturning)
- 异常通知(AfterThrowing)
- 最终通知(After)
- 环绕通知(Around)
AOP的实现
JdkProxy 和 Cglib
- 由AopProxyFactory根据AdvisedSupport对象来决定
- 默认策略如果目标类是接口,则用JdkPrixy来实现,否则用后者
- JDKproxy的核心:InvocationHandler接口和Proxy类
- Cglib(code generation library):以继承的方式动态生成目标的代理,通过修改字节码实现代理,如果某个类被标记final,那就无法使用Cglib进行代理
JdkProxy
- 通过Java的内部反射机制实现
- 反射机制在生成类的过程中比较高效
Cglib
- 通过ASM实现
- ASM在生成类之后的执行过程中比较高效
- 通过生成类进行缓存,以提高生成过程的效率
Spring里代理模式的实现
- 真实实现类的逻辑包含在了getBean方法里
- getBean方法返回的实际上是Proxy的实例
- Proxy实例是Spring采用JdkProxy 或 Cglib动态生成