Spring中AOP的简单使用

zjun Lv4

什么是AOP

AOP (Aspect  Orient Programming),直译过来就是 面向切面编程,是对面向对象编程的一种补充。AOP通过动态代理的方式,为系统提供某种通用的功能。

AOP的应用场景

典型的AOP使用场景有:

  • 日志记录

  • 事务管理

  • 权限验证

  • 性能检测

AOP的基本概念

核心概念

  • Joinpoint(连接点): 被拦截的点,在Spring中可以被动态代理拦截的目标类方法

  • Pointcut(切入点): 指要对那些 Joinpoint 进行拦截,即被拦截的连接点

  • Advice(通知): 指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容

  • Target(目标): 指代理的目标对象

  • Weaving(植入): 指把增强代码应用到目标上,生成代理对象的过程

  • Proxy(代理): 指生成的代理对象

  • Aspect(切面): 切入点和通知的结合

AOP 通知分类

  • before(前置通知): 通知方法在目标方法调用之前执行

  • after(后置通知): 通知方法在目标方法返回或异常后执行

  • after-returning(返回后通知): 通知方法在目标方法返回后执行

  • after-throwing(抛出异常通知): 通知方法在目标方法抛出异常后执行

  • around(环绕通知): 通知方法会将目标方法封装起来

一个例子

下面用一个简单的例子通过AOP来实现方法级的日志记录

定义注解

1
2
3
4
5
6
7
8
/**
* 一个方法级别的@log注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String operation() default "";
}

定义切面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Aspect
@Component
public class LogAsPect {
/**
* 定义切入点: 表示匹配带有自定义注解的方法
*/
@Pointcut("@annotation(com.zjun.aoplog.Log)")
public void operationLog() {
}

/**
* 在切入点的前后执行增强方法
*/
@Around("pointcut()")
public Object around(ProceedingJoinPoint point) {
Object result =null;
long beginTime = System.currentTimeMillis();

try {
log.info("在目标方法之前执行!");
result = point.proceed();
long endTime = System.currentTimeMillis();
log.info("目标方法执行时间:{}",endTime-beginTime);
} catch (Throwable e) {
// TODO Auto-generated catch block
}
return result;
}
}

关于AOP的几个重要注解:

  • @Aspect:这个注解表示将当前类视为一个切面类
  • @Component:表示将当前类交由Spring管理。
  • @Pointcut:切点表达式,定义我们的匹配规则,上边我们使用@Pointcut("@annotation(com.zjun.aoplog.Log)")表示匹配带有我们自定义注解的方法。
  • @Around:环绕通知,可以在目标方法执行前后执行一些操作,以及目标方法抛出异常时执行的操作。

在Controller中使用切面

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class HomeController {

@RequestMapping("/aop")
@ResponseBody
@Log("测试aoplog")
public Object aop(String name, String nick) {
Map<String, Object> map =new HashMap<>();
log.info("目标方法执行了!");
map.put("res", "ok");
return map;
}
}

执行结果:

1
2
3
在目标方法之前执行!
目标方法执行了!
目标方法执行时间:6
  • 标题: Spring中AOP的简单使用
  • 作者: zjun
  • 创建于 : 2019-05-20 16:40:52
  • 更新于 : 2023-11-30 21:14:48
  • 链接: https://zjun.site/2019/05/9e8623f096b1.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论