深入浅出——spring和AspectJ实现AOP操作

news2024/10/7 16:22:31

基本概念可看我之前的文章 AOP——基本概念、底层原理,这次直接来实现AOP的操作,在介绍操作之前,我们得先介绍AOP的各种术语

aop操作术语

1、连接点(JoinPoint):
类里面哪些方法可以被增强,这些方法称为连接点

比如说:一个类中有add updat delect select方法,这些方法都可以被增强,所以被称为连接点

2、切入点(Pointcut ):
实际被真正增强的方法,称为切入点

3、通知/增强(Advice):

(1)实际增强的逻辑部分称为通知/增强

(2)通知有多种类型:

  • 前置通知:在目标方法执行之前执行执行的通知。无论何时都第一个执行

  • 后置通知:在目标方法执行之后执行的通知。正常执行时第三个执行

  • 环绕通知:在环绕通知中必须显式的调用目标方法,目标方法才会执行,简单理解,环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的.

  • 异常通知:在目标方法抛出异常时执行的通知。出现异常时第三个执行

  • 最终通知:是在目标方法执行之后执行的通知。无论何时都第二个执行,和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返回例如抛出异常,则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。另外,后置通知可以通过配置得到返回值,而最终通知无法得到。

4、切面(Aspect):
是动作,把通知应用到切入点过程

5、引入:(Introduction) 表示向现有的类中添加新方法、新属性。

6、目标对象(Target) 表示被增强的对象。

7、代理(Proxy) 表示实现AOP的机制。

8、织入(Weaving) 表示把增强应用到目标对象的过程。

在了解了AOP各种操作术语后,我们就需要对实现AOP操作做准备工作了

aop准备工作

1、Spring的框架中,一般都是基于AspectJ来实现AOP操作

(1)什么是AspectJ

  AspectJ并不是Spring组成部分,它是独立AOP框架,一般把AspectJ和Spring框架一起使用, 进行AOP操作

(2)基于AspectJ实现AOP操作

  • 基于xml配置文件实现
    
  • 基于注解方式实现(使用)
    

3、在项目工程里面引入AOP相关依赖。

我们需要准备以下的AspectJ jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9LqxOpX-1670225871236)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/59aba9267e344d33b8a22db3fb9788a9~tplv-k3u1fbpfcp-watermark.image?)]

把这些jar导入到相关的spring项目下

4、切入点表达式、

(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强

(2)语法结构:

execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))

标准表达式写法:execution(public void com.dao.UserDao.add())

表达式中,可以用通配符来表示如:

举例1:
对com.dao.UserDao类里面的add进行增强。

execution(* com.dao.UserDao.add(..))

举例2:对com.atguigu.dao.BookDao类里面的所有的方法进行增强

execution(* com.dao.UserDao.* (..))

举例3:对com.atguigu.dao包里面所有类,类里面所有方法进行增强

execution(* com.atguigu.dao.*.* (.))

AspectJ注解

1.创建类,在类中定义方法

import org.springframework.stereotype.Component;
//User类,作为目标对象
@Component
public class AspectJUser {
    public void add(){
        System.out.println("add");
    }
}

2.创建增加类,编写增强逻辑

我们在增强类中创建不同的方法,让不同的方法代表不同的增强逻辑

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AspectJUserProxy {
//    前置通知
    @Before("execution(* com.springAOP.AspectJUser.add(..))")
    public void before(){
        System.out.println("before... ");
    }

    //最终通知
    @After("execution(* com.springAOP.AspectJUser.add(..))")
    public void after(){
        System.out.println("after...");
    }

    //后置通知
    @AfterReturning("execution(* com.springAOP.AspectJUser.add(..))")
    public void AfterReturning(){
        System.out.println("AfterReturning...");
    }

    //异常通知
    @AfterThrowing("execution(* com.springAOP.AspectJUser.add(..))")
    public void AfterThrowing(){
        System.out.println("AfterThrowing...");
    }

    //环绕通知——在方法之前之后都执行
    @Around("execution(* com.springAOP.AspectJUser.add(..))")
    public void Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
    //简单理解,环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的.
        System.out.println("Around前");
        proceedingJoinPoint.proceed();
        System.out.println("Around后");
    }
}

3、进行通知的配置
(1)在spring配置文件中,开启注解扫描。
(2)在spring配置文件中开启生成代理对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NufrhDei-1670225871237)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b62f7f749a7a4b1d9b4f03fadc9ea85c~tplv-k3u1fbpfcp-watermark.image?)]


<!--    开启注解扫描-->
<context:component-scan base-package="com.springAOP"></context:component-scan>
<!--    开启aspectj生成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

所有类写好,我们写一个test来验证一下

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AspectJTest {
    @Test
    public void testAop(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("com/bean1.xml");
        AspectJUser user = context.getBean("aspectJUser", AspectJUser.class);
        user.add();
    }
}

控制台:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NY5OAONp-1670225871238)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1fe2585aab384d80a1b1823207af9899~tplv-k3u1fbpfcp-watermark.image?)]

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

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

相关文章

小白必知必会的几个IP地址知识

小白必知必会的几个IP地址知识1.IP地址的定义2.IP地址的组成3.IP地址的分类4.广播地址5.IP多播6.子网掩码7.CIDR8.全局地址和私有地址1.IP地址的定义 IP地址(IPv4地址)由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部以二进…

三问HPE,你真的想买下Nu­t­a­n­ix么?

【全球存储观察 | 热点关注】据多个媒体消息报道&#xff0c;慧与科技HPE在近几个月与超融合提供商Nutanix就收购进行了谈判。 在这之前的2017年2月&#xff0c;HPE以6.5亿美元收购了超融合全球老二SimpliVity&#xff0c;后来整合成了HPE重要的超融合产品线&#xff0c;并进一…

全栈测试工程师是怎么样练成的?

不久前&#xff0c;一位朋友让帮忙推荐个测试工程师&#xff0c;于是聊到了他们对测试工程师的诉求。 朋友公司是一家做教育软件的公司&#xff1a;Web端、App端产品都有涉及。 最初的诉求就是想找一位有1-2年相关产品测试经验的人即可。 但经过几轮沟通后&#xff0c;他的诉求…

.NET代码调优让程序占用内存减少

建了一个默认的ASP.NET Core Web API的项目,也就是那个WeatherForecast的默认项目模板,然后他把默认的生成5条数据的代码,改成了生成150000条数据,其他代码没变,如下: public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 150000).Select(index…

毕业设计-基于机器学习的二维码和条形码识别

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

ssrf漏洞--补充部分

可以使用的协议 下面是攻击时常用的协议 http/httpsftptftpsftpfiledictGopherldapldapsldapi file://path/to/file dict://<user>;<auth><host>:<port>/d:<word>:<database>:<n> dict://127.0.0.1:1337/stats ftp://127.0.0.1/ …

git常见bug及其解决方案

git常用命令和常见bug1、git主要命令2、git commit 提交的时候报错husky > pre-commit hook failed3、git命令行将本地仓库代码上传到github或gitlab远程仓库4、没有git pull更新代码就push的报错5、git 拉取某个分支的某一个commit的代码6、GitLab中配置SSH key7、配置成和…

QT:布局管理器消息盒子

让组件在水平和垂直方向对齐 有三种常用布局管理器&#xff1a; 水平&#xff0c;QHBoxLayout 垂直&#xff0c;QVBoxLayout 网格&#xff0c;QGridLayout(使布局好的界面嵌套到主窗口) 1.让组件大小固定 修改属性&#xff1a;minimusize&#xff0c;maxmumsize 最小和最大组件…

腾讯智慧交通的「KPI底座」

腾讯智慧交通背后&#xff0c;打造的是产业数字化下的数字产业新模式&#xff0c;也更是数字孪生、全真互联的新底盘。 作者|斗斗 出品|产业家 过去的一年&#xff0c;交通行业迎来一份重磅的文件《国家综合立体交通网规划纲要》&#xff0c;该纲要有一个最为关注的数字指…

HTML设计一个简单的奥迪RS汽车主题网站( web网页制作期末大作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

节能灯与led灯哪个对眼睛好?分享专业护眼的led灯

led灯完胜&#xff0c;也是现在大部分家居主流灯具。 许多家庭有这个疑惑&#xff0c;节能灯与led灯哪个对眼睛好&#xff1f;节能灯最大亮点就是寿命长&#xff0c;能量转化率比白炽灯高很多&#xff0c;但是跟led灯相比&#xff0c;是led灯的转化率更高的。 那么节能灯有哪些…

Git浅浅入个门~

1 Git 1.1 安装配置 install 安装位置&#xff1a;$HOME/git二进制文件位置&#xff1a;/usr/bin/git /* Linux 源码安装 git */ [usernamehostname]$ git clone git://git.kernel.org/pub/scm/git/git.git [usernamehostname]$ cd git [usernamehostname]$ ./configure --…

【入门到精通】安装与运行PHP脚本语言

文档背景 突然看见XSS攻击和钓鱼网站一些实现的代码。突然对PHP语言燃起了兴趣&#xff0c;怎么可以用如此精简的流程去实现复杂的逻辑。所以来记录一下入门PHP的一个过程&#xff0c;以免遗忘。 1、PHP简介 PHP是什么? PHP&#xff08;全称&#xff1a;PHP&#xff1a;Hyper…

基于蒙特卡洛的大规模电动汽车充电行为分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

em13c 部署 AGENT报:SSH 服务器检查失败

报错信息如下&#xff1a; 2022-03-18_19-43-21:INFO: Jsch Valdation Failed Problem :SSH 服务器检查失败 Recommendation: 验证 /u02/em13c/oraclehome/oui/prov/resourcesPaths.properties 文件中 SSH_PORT 的值。请确保该值与远程主机上运行 sshd 的端口相同。 2022-03-18…

Linux(CentOS-7)-全面详解(学习总结---从入门到深化)

Linux概述 Linux特点 首先Linux作为自由软件有两个特点&#xff1a;一是它免费提供源代码&#xff0c; 二是爱好者可以根据自己的需要自由修改、复制和发布源码 Linux的各个发行版本 Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打 包。 1、Red Hat Linux 2、Ubu…

Word文档怎样翻译?Word文档翻译方法大分享

大家平时会被这种情况所困扰吗&#xff1f;在交接工作的时候&#xff0c;接收到一个Word文档&#xff0c;却发现是英文的&#xff0c;奈何自己的英语基础不够&#xff0c;难以完全理解文档里面的内容。这种情况我们该如何解决呢&#xff1f;别担心&#xff0c;今天教你Word文档…

如何实施企业采购战略?

拥有现代灵活的采购战略&#xff0c;不仅可以使企业降低成本和提高效率&#xff0c;而且还可以作为一种竞争优势&#xff0c;帮助企业增加收入。 根据行业的不同&#xff0c;供应链成本&#xff08;主要是采购和运输成本&#xff09;可能占销售额的50%至70%。因此&#xff0c…

[附源码]Python计算机毕业设计Django通用病例管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

开源消息引擎系统 Kafka 3新特性,一文带你了解

文章目录1、Kafka 简介2、kafka3 的安装配置3、Kafka 当中 Raft 的介绍4、Raft 算法介绍5、Kafka 常见问题1、Kafka 简介 Kafka 是一款开源的消息引擎系统。一个典型的 Kafka 体系架构包括若干 Producer、若干 Broker、若干 Consumer&#xff0c;以及一个 ZooKeeper 集群&#…