SpringBoot使用注解开发AOP

SpringBoot使用注解开发AOP

AOP是一种对面向对象编程的补充,它的全称是面向切面编程(Aspect Oriented Programming)。在面向对象编程中,主要关注的是类的结构和组织方式。而在AOP中,主要关注的是某种行为跨越多个类和层的情况,并使用切面来描述这种行为并将其应用到多个目标上。

AOP的核心概念有两个: 切面和连接点。切面描述了跨越多个类和层的行为,它包含了一组连接点。连接点是应用程序中执行某些操作的点,这些操作被称为建议。建议可以在连接点之前、之后或之间插入。

AOP的主要用途是在系统运行时跨越多个类和层应用特定行为,例如日志、事务管理、安全性等。通过使用AOP,可以将跨越多个类和层的行为抽象出来,并使其可重用和可维护。
Aop:
把一个个横切点关注点放到某一个模块中去,称之为切点。那么每一个切面都能影响业务的某一种功能。切点的目的就是功能的增强,比如日志切面,就是一个横切关注点。应用中许多方法需要做日志记录,只需要插入预制的切面即可。

SpringBoot使用注解开发AOP_第1张图片

1、AOP术语:

1、JoinPoint (连接点):被拦截到需要增强的方法。即 where:去哪里做增强操作
2. Pointcut (切入点):哪些包中的哪些类中的哪些方法做增强?可能是连接点的集合。where:去那些地方做增强
 // JoinPoint的集合

3、Advice: 当拦截到 JoinPoint 之后,在方法执行什么时机(when)做什么样(what)的增强。

根据时机分为:
(1)前置增强
(2)后置增强
(3)异常增强
(4)最终增强
(5)环绕增强

4、AsPect (切面):             何地        何时        做什么
    Pointcut+Advice ====>  去哪些地方 + 在什么时候 + 做什么增强?

5、Target: 目标对象,被代理的目标对象

6、weaving: 织入、把Advice加到 Target 上之后 创建出 Proxy 对象的进程
7、Poxy : 一个类被Aop织入增强后产生的代理类

Advice 执行时机:

 Public void dowork(){
    <------------------------------------前置增强
 try{
   //业务代码
   <------------------------------------后置增强
 
 }catch{
  // 异常处理
  <------------------------------------异常增强
 }finally{
 //释放资源
 <------------------------------------最终增强
 }
 
 
 }

2、Aop注解:

@Before: 在切点方法之前执行

@After:在切点方法之后执行

@AfterReturning: 切点方法返回后执行

@AfterThrowing: 切点方法抛异常执行

@Around: 属于环绕增强,能控制切点执行前,执行后,用这个注解后,程序抛异常,会影响@AfterThrowing这个注解

3、例:自定义注解结合Aop

步骤:

定义要被增强的业务类:
package cn.js.Controller;

import cn.js.proxy.ApiPermission;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @BelongsProject: SpringBootAop
 * @Author: com.js
 * @CreateTime: 2023-03-02  16:32
 * @Version: 1.0
 */

@RestController
@RequestMapping("/get")
public class StudentController {

    @GetMapping("/student")
    @ApiPermission //通过自定义的注解告诉SpringBoot这里作为切面
    public void Studnt(){
        System.out.println("执行修改操作");
    }

}

自定义注解
package cn.js.proxy;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

 /**
   *@description: 定义一个注解,作为切入点
   **/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiPermission {
}

定义一个切面类:
package cn.js.proxy;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @BelongsProject: 定义一个切面类
 * @Author: com.js
 * @CreateTime: 2023-03-02  16:35
 * @Version: 1.0
 */
@Component
@Aspect
public class AspectPermissit {

     /**
       *@description:  告诉aop我们是通过注解,cn.js.proxy下面的注解作为一个切入点,只要打上这个注解就要对其贴上注解方法做增强
         通过我们的注解作为一个切入点
       **/
    @Pointcut("@annotation(cn.js.proxy.ApiPermission)")
    public void texpoint(){

    }

     /**
       *@description: 比方说在我们这个texpoint 方法执行之前切入
       **/
     @Before("texpoint()")
    public void begin(){
         System.out.println("通过session或者redis,获取我们的用户信息");
         System.out.println("通过tokn解析出用户ID");
         System.out.println("再去查询是否有权限");
     }

      /**
        *@description: 比方说在我们这个texpoint 方法执行之后切入
        **/

      @After("texpoint()")
    public void login(){
          System.out.println("-------操作成功后执行------");
          System.out.println("提交事务!!!!");
      }
}

SpringBoot使用注解开发AOP_第2张图片

你可能感兴趣的:(SpringBoot,spring,boot,java,javascript)