Spring AOP
引言
要掌握 Spring AOP 框架,需要弄明白 AOP 的概念。
AOP 概念
AOP(Aspect Oriented Programming的缩写,翻译为面向方面或面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用 AOP 可以对业务逻辑的各个部分隔离,从而使的业务逻辑各部分的耦合性降低,提高程序的可重用性,踢开开发效率,使用 AOP 技术可以实现的主要功能有日志记录,性能统计,安全控制,事务处理,异常处理等。
AOP 技术的底层实现原理是 JDK 动态代理和 CGLIB 动态代理。这两种动态代理的区别是 JDK 动态代理必须实现接口,而 CGLIB 直接操纵字节码,可以做到不使用接口的情况下实现动态代理。
AOP 与 OOP 区别
OOP面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而 AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异。
AOP 术语
-
连接点(Joinpoint)
AOP 插入代码的特定位置(方法调用前、方法调用后、方法调用前后、抛出异常) -
切点(Pointcut)
AOP 定位或查找连接点的方式(一个切点可以匹配多个连接点) -
增强(Advice)
AOP 插入到连接点的一段程序代码(前置增强、后置增强、环绕增强和抛出异常增加) -
引介(Introduction)
特殊的增强(可以为类添加一些属性和方法) -
织入(Weaving)
插入代码的过程(AOP 有三种织入方式:编译器织入、类装载期织入、动态代理织入) -
切面(Aspect)
由切点和增强或引介组成(Spring AOP 是负责实施切面的框架)
Spring AOP 框架
Spring AOP 是使用纯 Java 实现 AOP,它不需要专门的编译过程,也不需要特殊的类装载器,它在运行期通过代理的方式向目标类织入增强代码。Spring AOP 使用了两种代理机制:JDK 动态代理和CGLib 动态代理,它们是 Spring AOP 底层技术。
Spring AOP 支持两种使用方式:
-
基于 XML 配置文件
-
基于注解
注解
<!– 开启 AOP 注解开关 -->
<aop:aspectj-autoproxy />
-
@Aspect 注解:放置于切面类上,用于注解定义一个切面
-
@Before 注解:放置于切面类方法上,用于注解实现前置增强
-
@After 注解:放置于切面类方法上,用于注解实现后置增强
-
@Around 注解:放置于切面类方法上,用于注解实现环绕增强
-
@AfterThrowing 注解:放置于切面类方法上,用于注解实现抛出异常增强
切点表达式
**切点表达式 = execution(返回值类型 + 包名 + 类名 + 方法名 + 参数个数) **
切点表达式支持三个通配符:
-
符号(*) :代表任意字符,匹配上下文中的一个元素
-
符号(..):代表任意字符,可以代表多个元素,但是在表示类的时候不能单独使用,必须和 * 配合;在代表形参的时候可以单独使用
-
符号(+):代表按类型匹配指定类的所有类(包括子类),只能跟在类名的后面
举例:
execution(* com.dt..Dog.b(..))
该切点表达式表示匹配 1)方法的任意类型返回值,2)方法必须是 com.dt 所在包 3)类名必须为Dog 4)方法名必须以字母 b 开头 5)方法参数个数不限
总结
AOP 可以通过预编译方式和运行期动态代理实现在不修改源码的情况下,给程序动态统一添加功能的一项技术。