Spring AOP

一:理解概念

---->AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的 集中处理

--->AOP 是⼀种思想,⽽ Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现,它们的关系和 IoC 与 DI 类似。

二:Spring AOP的实现:

1)添加Spring AOP依赖:

中央仓库搜索Spring AOP

----->在pom.xml中添加依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId> </dependency>

---->所有的依赖都是添加在</dependencies>标签内部的

2)定义切面:

--->切面其实就是一个类,只是类加了@Aspect和@Component注解:

@Aspect:表示此类是一个切面

@Component类注解,是为了让切面随着框架的启动而启动

3)定义切点:但是不实现,等别人实现

----->定义一个方法,是什么无所谓,但是一定要加上@Pointcut("xxxx")注解

--->xxx是AspectJ 表达式语法:

"execution(* com.example.demo.controller.UserController.* (..))"

--->execution:执行  执行( ) 里面的内容

--->第一个 * :这里代表返回值,而 * 则代表所有的类型的返回值--->拦截所有类型的返回值

--->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
}

4)执行通知

使用注解实现:然后再写一个方法(随便什么方法都行,看你的拦截规则是要实现什么)当做切点的实现方法

前置通知使⽤@Before("xxx"):通知⽅法会在⽬标⽅法调⽤之前执⾏。 (拦截方后,先执行通知,再执行拦截的方法)

后置通知使⽤@After("xxx"):通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。 (拦截后,先让被拦截的方法先执行,然后再执行通知)

返回之后通知使⽤@AfterReturning("xxx"):通知⽅法会在⽬标⽅法返回后调⽤。

抛异常后通知使⽤@AfterThrowing("xxx"):通知⽅法会在⽬标⽅法抛出异常后调⽤。

环绕通知使⽤@Around("xxx"):通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执 ⾏⾃定义的⾏为

-------->xxx代表我们定义的切点的名称(这里是pointcut())

---->名称一定要加(),而不是只写pointcut

@Before("pointcut()")
public void doBefo(){
    System.out.println("执行了前置通知");//打印验证是先执行前置通知,再执行被拦截的代码
}

---->然后我们测试一下:浏览器输入URL:localhost:8080/user/getuser

---->可以看到是先执行了前置通知的代码,然后再执行UserController类里面的getuser方法的

---->本来我们输入http://localhost:8080/user/getuser,后端应该要马上调用getuser方法的,但是现在被拦截了,然后先执行拦截的代码后才会执行getuser方法

---->其他的几个通知也是如此使用,只是执行的时机不同

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢可抵岁月漫长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值