AOP与SpringAOP

一、什么是AOP,什么是SpringAOP

AOP即Aspect-Oriented Programming面向切面编程。
它是一种思想,它是对某类事情的集中处理。
SpringAOP是一个框架,是AOP思想的一种具体实现产物。

二、AOP与拦截器的区别

SpringAOP是AOP思想实现的一个框架,但我们在项目中经常会用到AOP思想,但是不一定用SpringAOP实现。
有些项目中可能会用到SpringAOP,有的则是用到拦截器。
拦截器是基于AOP思想实现的,不依赖于SpringAOP。

简而言之,拦截器和SpringAOP都是AOP思想的具体实现,属于并列的关系。

三、实现SpringAOP

1.添加SpringBootAOP依赖

在这里插入图片描述

注意:因为我们是spring-boot项目,所以需要不能选择spring对应的aop,而应该是下边的springbootaop依赖。
又我们使用的spring-boot是2.x版本的,所以我们引入aop依赖就需要是2.x版本

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.7.5</version>
</dependency>

2.创建切面

创建切面,就是创建一个关于什么的类
在此基础上需要加两个注解@Aspect和@Component注解,交给spring管理

package com.example.demo.common;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class UserAOP {

}
3.创建切点

定义拦截规则,其实是一个空方法

//定义切点(配置拦截规则)
    //拦截全部返回值 UserController里的全部方法 参数第一个为int,第二个为String(int,String),这里以全部拦截为例
    @Pointcut("excution(* com.example.demo.controller.UserController.*(..)")
    public void pointcut(){
    }
4.创建通知

前置通知…

@Aspect
@Component
public class UserAOP {

    //定义切点(配置拦截规则)
    //拦截全部返回值 UserController里的全部方法 参数第一个为int,第二个为String(int,String),这里以全部拦截为例
    @Pointcut("excution(*com.example.demo.controller.UserController.*(..))")
    public void pointcut(){
    }

    @Before("pointcut()")//针对哪个切点
    public void doBefore(){
        System.out.println("执行了前置通知"+ LocalDateTime.now());
    }
}

环绕通知做次数统计非常方便。

5.创建连接点

UserController里创建
在这里插入图片描述
ArticleController
在这里插入图片描述

@Aspect
@RestController
@RequestMapping("/article")
public class ArticleController {
    @RequestMapping("/sayhi")
    public String sayHi(){
        System.out.println("hi article springaop");
        return "hi article springaop";
    }
}
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/sayhi")
    public String sayHi(){
        System.out.println("hi user springaop");
        return "hi user springaop";
    }

    @RequestMapping("/sayhi2")
    public String sayHi2(){
        System.out.println("hi user springaop2");
        return "hi user springaop2";
    }
}

效果

拦截了但是没有制止
只做了打印没做其他处理,所以只能看到打印结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值