Spring Aop
(Aspect orirnted Programming)面向切面编程,是对面向对象编程的一种补充,是一种编程思想,是对某一类的事情的集中处理。
比如用户登录状态的验证状态,在之前写servlet版本的博客系统,这里就有一个登录验证而且是在每一个页面都添加了一个登录验证,在使用Aop后,只需要写一个类就可以解决这个问题。
Aop
组成
-
切面(
Aspect
) -
切点(
Pointcut
) -
通知(
Advice
) -
链接点(
Jion Poit
)
实现AOP
步骤:
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
定义切面
@Aspect //定义切面 @Component public class UserAspect { }
-
定义切点
@Aspect //定义切面 @Component public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))") //空方法,主要是一个标识作用 public void pointcut(){} }
定义目录语法格式是
AspectJ
支持三种通配符 -
通知
具体实现方法
@RestController @RequestMapping("/user") public class UserController { @RequestMapping("/grtUser") public String getUser(){ System.out.println("do getUser"); return "get User"; } @RequestMapping("/delUser") public String delUser(){ System.out.println("do delUser"); return "delUser"; } }
实现通知
@Aspect //定义切面 @Component public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")//切点,括号中填写目录名称,在执行时会自动扫描方法,这⾥使⽤ AspectJ 表达式语法 public void pointcut(){ //目标方法,这⾥是空方法,主要是一个标识作用 } //前置通知 @Before("pointcut()") public void doBefore(){ System.out.println("执行了前置通知"); } //后置通知 @After("pointcut()") public void doAfter(){ System.out.println("执行了后置通知"); } //环绕通知 @Around("pointcut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕通知之前"); //执行目标方法 Object object = joinPoint.proceed(); System.out.println("环绕通知之后"); return object; } @AfterReturning("pointcut()") public void doAfterReturning(){ System.out.println("执行了返回方法"); } @AfterThrowing("pointcut()") public void doAfterThrowing(){ System.out.println("执行了抛出异常方法"); } }
四种通知方法:
AOP动态代理(实现原理)
Spring 动态代理组成:
课件