---->AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的 集中处理
--->AOP 是⼀种思想,⽽ Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现,它们的关系和 IoC 与 DI 类似。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
---->所有的依赖都是添加在</dependencies>标签内部的
--->切面其实就是一个类,只是类加了@Aspect和@Component注解:
@Component类注解,是为了让切面随着框架的启动而启动
----->定义一个方法,是什么无所谓,但是一定要加上@Pointcut("xxxx")注解
"execution(* com.example.demo.controller.UserController.* (..))"
--->第一个 * :这里代表返回值,而 * 则代表所有的类型的返回值--->拦截所有类型的返回值
--->com.example.demo.controller.UserController 代表你要拦截的类所在的包名和类名
--->最后一个了 * :代表方法,*代表要拦截所有的方法--->UserController类里面的所有方法都拦截
---->组和起来的意思是:对UserController类里面的所有的方法都进行拦截(即在执行方法前,先执行拦截代码)
@RestController
@RequestMapping("/user") //URL
public class UserController {
@RequestMapping("/getuser") //二级URL
public String getuser(){ //方法
System.out.println("执行了UserController类的 getuser方法");
return "get user"; //返回到前端浏览器
}
}
---->拦截UserController类里面的所有方法(这里只有getuser()方法)--->拦截类里面的所有方法
@Aspect
@Component
public class UserAspect {
//定义切点但是不实现
@Pointcut("execution(* com.example.demo.controller.UserController.* (..))")
public void pointcut(){} //切点名称pointcut
}
使用注解实现:然后再写一个方法(随便什么方法都行,看你的拦截规则是要实现什么)当做切点的实现方法
前置通知使⽤@Before("xxx"):通知⽅法会在⽬标⽅法调⽤之前执⾏。 (拦截方后,先执行通知,再执行拦截的方法)
后置通知使⽤@After("xxx"):通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。 (拦截后,先让被拦截的方法先执行,然后再执行通知)
返回之后通知使⽤@AfterReturning("xxx"):通知⽅法会在⽬标⽅法返回后调⽤。
抛异常后通知使⽤@AfterThrowing("xxx"):通知⽅法会在⽬标⽅法抛出异常后调⽤。
环绕通知使⽤@Around("xxx"):通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执 ⾏⾃定义的⾏为
-------->xxx代表我们定义的切点的名称(这里是pointcut())
@Before("pointcut()")
public void doBefo(){
System.out.println("执行了前置通知");//打印验证是先执行前置通知,再执行被拦截的代码
}
---->然后我们测试一下:浏览器输入URL:localhost:8080/user/getuser
---->可以看到是先执行了前置通知的代码,然后再执行UserController类里面的getuser方法的
---->本来我们输入http://localhost:8080/user/getuser,后端应该要马上调用getuser方法的,但是现在被拦截了,然后先执行拦截的代码后才会执行getuser方法