Spring 实战 六: 什么是面向切面编程

224 阅读2分钟

软件系统中的一些功能需要应用到应用程序的多个地方,如日志、安全、缓存和声明式事务。

散布于应用中多处的功能被称为横切关注点,这些横切关注点从逻辑上与应用的业务逻辑相分离,但往往会直接嵌入到业务逻辑之中,把这些横切关注点从业务逻辑分离正是面向切面编程要解决的问题。

  1. 继承委托使对象体系变得复杂,切面提供了另一种更加清晰简洁的方案。
  2. 每个关注点都集中在一个地方,不用分散在代码中。
  3. 服务模块更简洁,因为他们只关注核心功能。

通知(Advice)

切面要完成的工作(什么),何时完成这个工作(何时)。

  1. before:前置通知
  2. After:后置通知
  3. After-returning:目标方法执行之后执行通知
  4. After-throwing:在目标方法抛出异常后执行通知
  5. Around:包裹了目标方法,在方法执行前和调用后执行通知

连接点(Join point)

应用执行过程中能够插入切面的点,切面可以利用这些点插入到正常业务逻辑之中,并添加新的行为。

切点(Poincut)

一个切面不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点的范围(何处)。

切面(Aspect)

切面是通知和切点的结合,通知和切点共同定义了切面的全部内容——切面要完成什么功能,在何时何处完成。

引入(Introduction)

向现有类添加新的方法或属性。

织入(Weaving)

织入把切面应用到目标对象并创建新的代理对象,切面在指定的连接点织入到目标对象,可在多个可选的对象声明周期里织入:

  1. 编译期:需要特殊的编译器,如 AspectJ 的织入编译器
  2. 类加载期:目标类加载到 JVM 时织入,需要特殊的类加载器(ClassLoader),增强目标类的字节码
  3. 运行期:运行时,AOP 容器动态的为目标对象创建代理对象,如 Spring AOP