AOP:Aspect oriented programming
面向切面编程,是 OOP 的一种延续、补充
OOP 思想是一种垂直纵向的继承体系,通过子类继承父类可以解决大部分的代码重复问题,但对于一些特殊问题,如在父类的所有方法的相同位置进行一些日志控制,OOP 无法解决
AOP 就是解决这些问题的,它通过一种横向抽取机制,将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,也就是切面,通过将横切逻辑代码与业务代码分离,在不改变原有代码的基础下,将逻辑增强部分应用到原有业务中,从根本上解耦,避免大量的重复操作,降低了模块间的耦合度,提高了系统的可维护性
实现
AOP 的实现是基于 代理模式 的,主要分为静态代理与动态代理
静态代理使用 AspectJ
来实现,动态代理则以 Spring AOP
为代表
AspectJ 与 Spring AOP 的区别
AspectJ
:它属于编译时增强,它会在编译阶段就生成 AOP 的代理类,并将切面织入到字节码中,运行的时候就是增强之后的 AOP 对象,性能比 Spring AOP 好Spring AOP
:它属于运行时增强,AOP 框架不会修改字节码,在每次运行时都会在内存中临时为方法生成一个代理对象,这个对象包含了目标对象的所有方法,并且在特定的切点做了增强处理,并回调原对象的方法
动态代理中主要有两种形式:JDK 动态代理和 CGLIB 动态代理
- JDK:要求代理类实现接口
- CGLIB:代理类没有实现接口,在运行时动态生成一个代理对象的子类对象,并覆盖其中特定的方法并添加增强代码,从而实现 AOP
主要应用
日志、事务、缓存、参数校验、权限验证、安全检查