概述
在软件开发过程中,分布于应用多处的功能被称为横切关注点(cross-cutting concerns)。横切关注点从概念上是与应用的业务逻辑相分离的(但需要嵌入到应用的业务逻辑中)。将这些横切关注点与业务逻辑相分离就是面向切面编程(AOP)所要解决的。
简而言之,横切关注点可以被描述为影响应用多处的功能(例如:安全、事物)。
横切关注点可以模块化为特殊的类,这些类被成为切面。
好处
- 每个关注点都集中在一个特殊的类中,而不是分散在多处不同的业务逻辑中。
- 服务模块更简洁。(服务模块只包含主要关注点(或核心功能)的代码,次要关注点的代码被转移到切面中。)
术语
通知(Advice)
切面的工作被称为通知。定义了切面是什么以及何时使用。
- Before:在方法被调用之前调用通知。
- After:在方法完成之后调用通知,无论方法执行是否成功。
- After-returning:在方法成功执行之后调用通知。
- After-throwing:在方法抛出异常之后调用通知。
- Around:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
连接点(Joinpoint)
在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码利用这些点插入到应用的正常流程之中,并添加新的行为。
切点(Poincut)
定义了切面在何处使用。会匹配通知所要织入的一个或多个连接点。
切面(Aspect)
通知和切点的结合。通知和切点定义了关于切面的全部内容。
引入(Introduction)
允许我们向现有的类添加新方法或属性。
织入(Weaving)
将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。
- 编译期:切面在目标类编译时被织入。需要特殊的编译器。
- 类加载期:切面在目标类加载到 JVM 时被织入。需要特殊的类加载器(ClassLoader)。
- 运行期:切面在应用运行的某个时刻被织入。
Spring AOP
- 基于代理的经典 AOP
- @AspectJ 注解驱动的切面
- 纯 POJO 切面
- 注入式 AspectJ 切面(适合 Spring 各版本)
小结
以上是 Spring 面向切面的基本信息,实际应用可以通过 XML 配置或者注解来实现。