springboot面向切面编程的基本使用

1.添加如下依赖

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

2.直接创建一个Aspect 包,包里面存放如下代码

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Aspect//  修饰范围:只能用在类上,作用:代表该类是一个切面类
@Configuration
@Order(1)
public class MyAspect {
  
  /**
  *  execution(com.cd.layui.*.*(..) ):代表在com.cd.layui包下的所有类的所有方法上(忽略  参数)上执行,execution只能作用在方法上
  * within(com.cd.layui.service.impl.*):作用在类上面,代表作用在com.cd.layui.service.impl下的所有类的所有方法上
  * joinPoint连接点,可以通过它获取到当前在哪个类,哪个方法,哪个
  */
@Before("execution(com.cd.layui.*.*(..) )")
public void before(JoinPoint joinPoint)){
   sout("==============前置附加操作")
   System.out.println("目标方法名称:"+joinPoint.getSignature().getName());
        System.out.println("目标方法参数:"+joinPoint.getArgs());
        System.out.println("目标对象:"+joinPoint.getTarget());
}

@After("execution(com.cd.layui.*.*(..) )")
public void before(){
   sout("==============后置附加操作")
}


  /**
   * 环绕通知, 当目标方法执行时会先进入环绕通知,然后在环绕通知放行
   * 之后进入目标方法,然后执行目标方法,目标方法执行完成之后回到环绕
   * 通知
   */
   @Around("within(com.cd.layui.service.impl.*ProductServiceImpl)")
 public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
       System.out.println("进入环绕通知业务处理··");
       System.out.println("目标方法名称"+proceedingJoinPoint.getSignature().getName());
       System.out.println("目标对象"+proceedingJoinPoint.getTarget());
       Object proceed = proceedingJoinPoint.proceed();//放行执行业务方法
       System.out.println("业务方法执行之后的业务处理··");
       return proceed;
 }
 
  //前置通知方法 在目标方法执行之前执行操作
      @Before("within(com.cd.layui.service.impl.*ProductServiceImpl)")
 public void bofore(JoinPoint joinPoint){
          System.out.println("目标方法名称:"+joinPoint.getSignature().getName());
          System.out.println("目标方法参数:"+joinPoint.getArgs());
          System.out.println("目标对象:"+joinPoint.getTarget());
          System.out.println("前置通知业务处理");

 }
      // 后置方法   在目标方法执行之后的操作
     @After("within(com.cd.layui.service.impl.*ProductServiceImpl)")
   public void after(JoinPoint joinPoint){  // JoinPoint joinPoint
         System.out.println("后置通知的业务");
         System.out.println("目标方法名称"+joinPoint.getSignature().getName());
         System.out.println("目标方法参数:"+joinPoint.getArgs());
         System.out.println("目标对象"+joinPoint.getTarget());

     }
}
  假设我们平时在写业务逻辑的时候,需要按照先后顺序使用切面,这个时候,Spring为我们提供了@Order这个注解
  但是在springboot中我们需要创建两个不同的切面类,在切面类上面添加@Order这个注解(springboot中加在方法上无效),@Order()里面的值越小,越先执行这个切面。

基于自定义注解的切点表达式(常用)
1.新建自定义注解
在这里插入图片描述
2.在切面类中编写注解形式切入表达式
在这里插入图片描述
这样之后代表以后再任何类的方法上面面只要看到了该注解就知道该方法要被切入

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值