[SpringBoot] AOP-AspectJ 切面技术

news2024/11/18 5:43:24

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

 📚📚系列专栏: 📖 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注解的方法才进行增强

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python的编译器与解释器

作者介绍&#xff1a; &#x1f425;作者&#xff1a;小刘在C站 &#x1f446;每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生 &#x1f341;夕阳下&#xff0c;是最美的绽放 目录 一.为什么会有编译器和解释器 二.编译器和解释器的区别 三.python解释器种类…

RK3399应用开发 | 移植libdrm到rk3399开发板(2.4.113)

一、下载源码 下载地址:https://dri.freedesktop.org/libdrm/。 这里我下载最新的2.4.113版本: wget https://dri.freedesktop.org/libdrm/libdrm-2.4.113.tar.xz解压: xz -d libdrm-2.4.113.tar.xz tar -xf libdrm-2.4.113.tar二、编译环境安装 1. 更新python ubuntu安…

CalBioreagents 艾美捷重组BCOADC-E2蛋白说明书

艾美捷CalBioreagents 重组BCOADC-E2蛋白英文说明&#xff1a; PRODUCT DESCRIPTION: Branched Chain 2-Oxo-Acid Dehydrogenase Complex E2 protein, recombinant. CLINICAL INDICATION: Primary biliary cirrhosis CATALOG NUMBER: A268 SOURCE: Recombinant protein ex…

《CTF攻防世界web题》之茶壶我爱你(2)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;被吉师散养的职业混子 &#x1fad2;文章目的&#xff1a;记录唯几我能做上的题 &#x1f342;相应专栏&#xff1a;CT…

Pytorch调用GPU时显示CUDA版本过低的解决方案

在调用torch.cuda.is_available时&#xff0c;有如下报错&#xff1a; cuda initialization: The Nvidia driver on your system is too old. 事情的发展是这样的&#xff1a; 1. 服务器的CUDA版本是10.1&#xff0c;仅支持pytorch版本最高1.7&#xff1b;前几天跑项目需要用…

Oracle 中常用的字符串函数总结

一、substr 函数 —— 字符串截取 格式1&#xff1a; substr(string,start_pos,length) 格式2&#xff1a; substr(string,start_pos) 说明&#xff1a; 从指定位置start_pos截取字符串string的length位&#xff0c;如果不指定length&#xff08;格式2&#xff09;则从指…

【数据挖掘】2022数据挖掘之Pandas库相关使用

数据挖掘之Pandas库相关使用一、概念1、介绍2、Pandas的优点3、软件推荐&#xff08;Jupyter Notebook&#xff09;4、软件下载网址以及参考文档二、基础知识1、DataFrame属性和方法1.1 结构&#xff08;1&#xff09;行索引&#xff08;2&#xff09;列索引1.2 常用属性&#…

配置非法AP设备检测和反制

1、业务需求 某企业分支机构为了保证工作人员可以随时随地访问公司网络资源&#xff0c;部署WLAN基本业务实现移动办公。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 分支机构位于开放式场所&#xff0c;容易受到网络入侵&#xff0c;例如攻击者在WLAN网络…

摒弃“短板”——数据中心基础设施运维管理建议书

数据中心是数字基础设施的重要组成部分&#xff0c;同时也是一整套复杂的设施。它不仅仅包括计算机系统和其它与之配套的设备&#xff08;例如通信和存储系统&#xff09;&#xff0c;还包含冗余的数据通信连接、环境控制系统、监控系统以及各种安全系统。运维管理又是数据中心…

基于智能优化算法实现自动泊车的路径动态规划(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 作为一种方便、快捷的交通工具&#xff0c;汽车已成为人们生活和工作的重要组成部分。随着汽车数量的逐年增加&#xff0c;有限…

在ubuntu上用QT写一个简单的C++小游戏(附源码)

最近老师让用Qt写一个可视化界面&#xff0c;然后就给了一个小视频&#xff0c;好奇的不得了&#xff0c;就照着做了一下 视频链接如下&#xff1a;C案例教学–一个类游戏小程序的设计与实现全过程–用到QT-简单的STL容器 创建项目 1、打开QT 如果不知道怎么下载的话&#xff…

【牛客网刷题】VL8-VL10 generate for语句、比较数大小、function的使用

&#x1f449; 写在前面 &#x1f449; 本系列博客记录牛客网刷题记录 &#x1f449; 日拱一卒&#xff0c;功不唐捐&#xff01; 目录 VL8 使用generate for语句简化代码 题目描述 输入描述 输出描述 RTL 设计 testbench 设计 仿真测试 VL9 使用子模块实现三输入数的大…

【C++ 程序设计入门基础】- Chapter One

目录 一、什么是 C&#xff1f; 1、概念 2、标准库 二、第一个 C 程序 1、下载 C 开发工具 2、开始下载好之后&#xff0c;我们先设置一下编码&#xff0c;解决中文注释不显示的问题。 3、下面我们就可以新建一个源代码 4、 编写完成后&#xff0c;我们就可以运行查看结果…

MyBatis:缓存机制详解

本篇内容包括&#xff1a;MyBatis 缓存机制概述、一级缓存与二级缓存的介绍、配置和具体流程。 一、MyBatis 缓存机制概述 在我们常见的 OLTP&#xff08;on-line transaction processing&#xff0c;联机事务处理&#xff09;类型的 Web 应用中&#xff0c;性能的瓶颈往往来源…

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

目录前言一、注意力机制&#xff1a;Attention二、自注意力机制&#xff1a;Self-Attention三、多头注意力机制&#xff1a;Multi-Head Self-Attention四、位置编码&#xff1a;Positional EncodingReference前言 最近在学DETR&#xff0c;看源码的时候&#xff0c;发现自己对…

【码上掘金编程挑战赛】- 前端可冲【简历加分项】

【码上掘金编程挑战赛】1.比赛报名2. 比赛介绍赛题一&#xff1a;码上游戏赛题二&#xff1a;码上创意赛题三&#xff1a;码上文言文赛题四&#xff1a;码上10243.报名4.提交作品1.比赛报名 比赛报名链接 https://juejin.cn/challenge/1?utm_source3169 2. 比赛介绍 赛题一…

Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】

Spring5入门到实战------12、使用JdbcTemplate操作数据库&#xff08;增删改查&#xff09;。具体代码讲解 【上篇】 Spring5入门到实战------13、使用JdbcTemplate操作数据库&#xff08;批量增删改&#xff09;。具体代码讲解 【下篇】 以上两篇采用的是注解开发形式xml配置…

自己动手写操作系统系列第3篇,实现时钟和键盘中断

对应labOS版本1.3 程序源码可以私聊我 picirq.h int 0x20~0x2f接收中断信号IRQ0~15&#xff0c;因为int 0x00~0x1f不能用于IRQ。 picirq.c pic0_mask0xfb即1111 1011&#xff1b;PIC1以外全部禁止。pic1_mask0xff即1111 1111&#xff1b;禁止所有中断 pic_enable函数就是将…

【Linux下安装jdk】Linux下安装jdk

Linux下安装jdk 1、-RPM安装 1.1、检查系统是否安装过jdk java -version 检查是否有安装包 rpm -qa | grep java 1.2、安装jdk 查看服务器版本: uname -a 下载jdk对应rpm包: https://www.oracle.com/java/technologies/downloads/#java8 上传安装包至任意目录下&…

用户登录权限校验 JWT【详解】

JWT &#xff08;json web token&#xff09;是当前最流行的用户登录权限校验&#xff08;用户认证鉴权&#xff09;方案。 官网 https://jwt.io/ JWT 的工作流程 客户端填写账号密码访问登录接口 login&#xff0c;将账号密码传给服务端服务端验证账号密码是否正确&#xff0c…