Spring AOP 简介

1 AOP概述

AOP是什么:

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域的面向切面编程。简单来说,就是在不修改源码的情况下,增添业务扩展功能的一种技术。

与OOP之间的区别,AOP是在运行期、动态的植入功能或控制对象执行,而OOP主要对象是静态的。

原理分析:

1) 假如目标对象(被代理对象)实现接口,则底层可以采用 JDK 动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)。

2) 假如目标对象(被代理对象)没有实现接口,则底层可以采用 CGLIB 代理机制为目标对象创建代理对象(默认创建的代理类会继承目标对象类型)。

Spring AOP 简介_第1张图片

Spring 中 AOP 相关术语分析

  • 目标类:我们需要扩展功能业务的对象。

▪ 切面(aspect): 横切面对象,一般为一个具体类对象(可以借助@Aspect 声明)。

▪ 通 知 (Advice): 在 切 面 的 某 个 特 定 连 接 点 上 执 行 的 动 作 ( 扩 展 功 能 ) , 例 如
around,before,after 等。

▪ 连接点(joinpoint):程序执行过程中某个特定的点,一般指向被拦截到的目标方法。

▪ 切入点(pointcut):对多个连接点(Joinpoint)一种定义,一般可以理解为多个连接点的集合。

Spring AOP 简介_第2张图片

2 Spring AOP 快速实践

maven配置:


 org.springframework.boot
 spring-boot-starter- aop

说明:基于此依赖spring可以整合AspectJ框架快速完成AOP的基本实现。AspectJ
是一个面向切面的框架,他定义了 AOP 的一些语法,有一个专门的字节码生成器来生成遵
守 java 规范的 class 文件。

创建切面类对象:

package com.cy.pj.common.aspect;
@Aspect
@Slf4j
@Component
public class SysLogAspect {
@Pointcut("bean(sysUserServiceImpl)")
public void doLogPointCut() {}
@Around("doLogPointCut()")
public Object around(ProceedingJoinPoint jp)
throws Throwable{
try {
 log.info("start:{}"+System.currentTimeMillis());
 Object result=jp.proceed();//最终会调用目标方法
 log.info("after:{}"+System.currentTimeMillis());
 return result;
}catch(Throwable e) {
 log.error("after:{}",e.getMessage());
 throw e;
}
}
}

@Aspect 注解用于标识或者描述 AOP 中的切面类型,基于切面类型构建的对象用于为目标对象进行功能扩展或控制目标对象的执行。

▪ @Pointcut 注解用于描述切面中的方法,并定义切面中的切入点(基于特定表达式的方式进行描述),在本案例中切入点表达式用的是 bean 表达式,这个表达式以 bean开头,bean 括号中的内容为一个 spring 管理的某个 bean 对象的名字

▪ @Around 注解用于描述切面中方法,这样的方法会被认为是一个环绕通知(核心业务方法执行之前和之后要执行的一个动作),@Aournd 注解内部 value 属性的值为
一个切入点表达式或者是切入点表达式的一个引用(这个引用为一个@PointCut 注解描述的方法的方法名)。

▪ ProceedingJoinPoint 类为一个连接点类型,此类型的对象用于封装要执行的目标方法相关的一些信息。只能用于@Around 注解描述的方法参数。

你可能感兴趣的:(java,spring)