当前位置: 首页 > news >正文

[SpringBoot] AOP-AspectJ 切面技术

 ✨✨个人主页:沫洺的主页

 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

💖💖如果文章对你有所帮助请留下三连✨✨

🍭AspectJ简介

  1. 它不属于spring;

  2. AspectJ是一个AOP的框架;

  3. 定义了AOP语法;

  4. 有一个专门的编译器用来生成遵守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));
    }
}

无异常时

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

补充配置说明

//两种占位符
//* 代表的是一个单词,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注解的方法才进行增强

相关文章:

  • Prometheus + Grafana 监控SpringBoot项目
  • [C]编译和预处理详解
  • C++入门(正在更新)
  • 风控大佬的一天从这两张报表开始(搬砖)了
  • 【SpringBoot】72、SpringBoot中集成Graylog分布式日志框架
  • STM32CubeMX学习笔记(44)——USB接口使用(HID按键)
  • ElasticSearch 学习(一)-- 概念
  • 用户登录权限校验 JWT【详解】
  • php laravel开发的个人博客源码分享,支持适配移动端附截图
  • 基于模糊认知图谱和遗传算法的龋齿度检测(Matlab代码实现)
  • 【表面缺陷检测】基于yolov5的PCB表面缺陷检测(附代码)
  • 主动学习(Active Learning)简介综述汇总以及主流技术方案
  • 详解KMP
  • 基于QD求解法的二分类SVM仿真
  • 【音视频】1、图像、视频编码、网络协议超详细介绍
  • 【React系列】如何构建React应用程序
  • Android交互
  • Angular 响应式表单 基础例子
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript 一些 DOM 的知识点
  • PHP 的 SAPI 是个什么东西
  • SpiderData 2019年2月16日 DApp数据排行榜
  • 后端_MYSQL
  • 警报:线上事故之CountDownLatch的威力
  • 免费小说阅读小程序
  • ionic入门之数据绑定显示-1
  • mysql面试题分组并合并列
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #if 1...#endif
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (70min)字节暑假实习二面(已挂)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (区间dp) (经典例题) 石子合并
  • (全注解开发)学习Spring-MVC的第三天
  • (译)计算距离、方位和更多经纬度之间的点
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)EOS中账户、钱包和密钥的关系
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET成年了,然后呢?
  • .NET使用存储过程实现对数据库的增删改查
  • .NET中两种OCR方式对比
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @JsonSerialize注解的使用
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [《百万宝贝》观后]To be or not to be?
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票