SpringBoot AOP AspectJ切面技术介绍与实现方式

作者:沫洺 时间:2022-12-27 22:03:53 

AspectJ简介

  • 它不属于spring;

  • AspectJ是一个AOP的框架;

  • 定义了AOP语法;

  • 有一个专门的编译器用来生成遵守Java字节编码规范的Class文件

Spring AOP 回顾

什么是AspectJ

  • AspectJ是使用面向切面的一个框架

  • 它扩展了Java语言(它本身也是一种语言)

  • 支持原生Java代码 有自己的编译器

  • 将代码翻译成Java字节码文件

  • 是为了方便编写AOP代码而出现的

  • 使用AOP编程的三个重点 通知 切点 织入

实现AOP的方式

原生使用切面

添加AOP坐标

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

创建增强类MyAOP

对service层下的所有类的所有方法进行增强

@Component
@Aspect
public class MyAOP {
   //定义切点
   @Pointcut("execution(* com.moming.service.*.*(..))")
   public void point(){}
   @Before("point()")
   public void before(){
       System.out.println("===>前置通知");
   }
   @After("point()")
   public void after(){
       System.out.println("===>后置通知");
   }
   @Around("point()")
   public Object arround(ProceedingJoinPoint pjp) throws Throwable {
       System.out.println("===>环绕前");
       Object resules = pjp.proceed();
       System.out.println("===>环绕后");
       return resules;
   }
   @AfterReturning(value = "point()",returning = "ret")
   public void returning(JoinPoint jp, String ret){
       Object[] args = jp.getArgs();
       System.out.println("返回后通知获取参数: "+Arrays.toString(args));
       System.out.println("===>返回后通知,返回值: "+ret);
   }
   @AfterThrowing("point()")
   public void throwing(){
       System.out.println("===>异常通知");
   }
}

service/OrderService

@Service
public class OrderService {
   public String order(int id){
       System.out.println("===>目标方法:订单业务ID:"+id);
       return "001202210121010";
   }
}

启动类测试

@SpringBootApplication
public class App2 {
   public static void main(String[] args) {
       ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
       OrderService bean = context.getBean(OrderService.class);
       System.out.println(bean.order(1));
   }
}

无异常时

SpringBoot AOP AspectJ切面技术介绍与实现方式

有异常时,后续代码就不再执行了

SpringBoot AOP AspectJ切面技术介绍与实现方式

补充配置说明

//两种占位符
//* 代表的是一个单词,b* 代表的是以b开头的单词。 例如 bds
//.. 通配符 ,代表的是0个或者多个匹配项

通过注解使用切面

声明注解NeedCut

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface NeedCut {
}

切换注解

@Component
@Aspect
public class MyAOP {
   //定义切点
   @Pointcut("@annotation(com.moming.annotation.NeedCut)")
   public void point(){}
   @Before("point()")
   public void before(){
       System.out.println("===>前置通知");
   }
   @After("point()")
   public void after(){
       System.out.println("===>后置通知");
   }
   @Around("point()")
   public Object arround(ProceedingJoinPoint pjp) throws Throwable {
       System.out.println("===>环绕前");
       Object resules = pjp.proceed();
       System.out.println("===>环绕后");
       return resules;
   }
   @AfterReturning(value = "point()",returning = "ret")
   public void returning(JoinPoint jp, String ret){
       Object[] args = jp.getArgs();
       System.out.println("返回后通知获取参数: "+Arrays.toString(args));
       System.out.println("===>返回后通知,返回值: "+ret);
   }
   @AfterThrowing("point()")
   public void throwing(){
       System.out.println("===>异常通知");
   }
}

使用注解@NeedCut

@Service
public class OrderService {
   @NeedCut
   public String order(int id){
       System.out.println("===>目标方法:订单业务ID:"+id);
       return "001202210121010";
   }
   public void add(){
       System.out.println("===>添加订单");
   }
}

测试

@SpringBootApplication
public class App2 {
   public static void main(String[] args) {
       ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
       OrderService bean = context.getBean(OrderService.class);
       System.out.println(bean.order(01));
       System.out.println("-------------------");
       bean.add();
   }
}

使用@NeedCut注解的方法才进行增强

SpringBoot AOP AspectJ切面技术介绍与实现方式

来源:https://blog.csdn.net/HeyVIrBbox/article/details/127525756

标签:SpringBoot,AOP,AspectJ,切面
0
投稿

猜你喜欢

  • springboot之端口设置和contextpath的配置方式

    2023-10-05 14:16:20
  • Springboot-Starter造轮子之自动锁组件lock-starter实现

    2022-01-21 03:53:59
  • Windows编写jar启动脚本和关闭脚本的操作方法

    2021-05-28 04:36:58
  • idea2020.1无法自动加载maven依赖的jar包问题及解决方法

    2021-06-13 17:40:36
  • 详解context root修改无效web修改项目路径(eclipse)

    2022-08-04 13:08:46
  • 如何为Repository添加自定义方法

    2022-05-13 20:08:24
  • Spring使用ThreadPoolTaskExecutor自定义线程池及异步调用方式

    2022-07-22 21:53:32
  • Spring JPA整合QueryDSL的示例代码

    2022-12-02 18:56:22
  • SpringBoot整合ActiveMQ的详细步骤

    2023-08-25 07:03:44
  • 详解EventBus 3.x 的快速使用

    2021-09-04 21:00:29
  • 深入多线程之:双向信号与竞赛的用法分析

    2022-02-17 06:54:49
  • C#操作串口通信协议Modbus的常用方法介绍

    2023-01-20 04:06:58
  • java后台接收app上传的图片的示例代码

    2022-11-03 00:04:15
  • 国内分布式框架Dubbo使用详解

    2022-05-10 13:38:27
  • C#实现将一个字符串进行翻转显示的6种方法

    2022-05-07 22:55:10
  • Java接口统一样式返回模板简介

    2022-10-31 19:50:43
  • Java中的递归详解(用递归实现99乘法表来讲解)

    2021-12-30 14:14:10
  • 关于Spring BeanPostProcessor的执行顺序

    2022-03-17 23:53:41
  • Java Scanner 类的使用小结

    2023-11-29 00:50:39
  • c++指针使用形参改变实参的方法

    2023-03-11 22:40:21
  • asp之家 软件编程 m.aspxhome.com