SpringBoot使用注解开发AOP
AOP是一种对面向对象编程的补充,它的全称是面向切面编程(Aspect Oriented Programming)。在面向对象编程中,主要关注的是类的结构和组织方式。而在AOP中,主要关注的是某种行为跨越多个类和层的情况,并使用切面来描述这种行为并将其应用到多个目标上。
AOP的核心概念有两个: 切面和连接点。切面描述了跨越多个类和层的行为,它包含了一组连接点。连接点是应用程序中执行某些操作的点,这些操作被称为建议。建议可以在连接点之前、之后或之间插入。
AOP的主要用途是在系统运行时跨越多个类和层应用特定行为,例如日志、事务管理、安全性等。通过使用AOP,可以将跨越多个类和层的行为抽象出来,并使其可重用和可维护。
Aop:
把一个个横切点关注点放到某一个模块中去,称之为切点。那么每一个切面都能影响业务的某一种功能。切点的目的就是功能的增强,比如日志切面,就是一个横切关注点。应用中许多方法需要做日志记录,只需要插入预制的切面即可。
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("提交事务!!!!");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188563.html