AOP与SpringAOP

AOP与SpringAOP

    • 一、什么是AOP,什么是SpringAOP
    • 二、AOP与拦截器的区别
    • 三、实现SpringAOP
        • 1.添加SpringBootAOP依赖
        • 2.创建切面
        • 3.创建切点
        • 4.创建通知
        • 5.创建连接点
      • 效果

一、什么是AOP,什么是SpringAOP

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

二、AOP与拦截器的区别

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

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

三、实现SpringAOP

1.添加SpringBootAOP依赖

AOP与SpringAOP_第1张图片

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


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-aopartifactId>
    <version>2.7.5version>
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里创建
AOP与SpringAOP_第2张图片
ArticleController
AOP与SpringAOP_第3张图片

@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";
    }
}

效果

拦截了但是没有制止
只做了打印没做其他处理,所以只能看到打印结果:
AOP与SpringAOP_第4张图片

你可能感兴趣的:(JAVA,EE,java,aop,spring,spring,boot)