Spring:Aop

news2024/10/6 18:22:58

目录

一、Aop简介 

AOP相关术语

二、使用AOP


一、Aop简介 

AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结

原理:将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决

采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能

作用︰通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术

Spring理念︰无入侵式/无侵入式

AOP相关术语

增强处理(Advice):前置增强,后置增强,环绕增强,异常抛出增强,最终增强

切入点(Pointcut):匹配连接点的式子

在SpringAoP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

连接点(Join Point):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等

在springAOP中,理解为方法的执行

切面(Aspect):描述通知与切入点的对应关系

目标对象(Target object

AOP代理(AOP proxy

织入(Weaving

二、使用AOP

例如:使用Spring AOP实现日志输出

1.在项目中添加Spring AOP的jar文件

<!-- aop依赖 -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.6</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
    <!--日志包-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
    </dependency>

2.编写前置增强和后置增强实现日志功能,创建一个AOP的包,里面建一个类,写如一个方法

public class LogBufferAop {

    private static final Logger log = Logger.getLogger(LogBufferAop.class);

    /*   *//**
     * 前置增强
     * @param joinPoint
     */

    public void before(JoinPoint joinPoint){
        log.info("正在调用" + joinPoint.getTarget() + "的"
                + joinPoint.getSignature().getName()+"方法入参是:"
                + Arrays.toString(joinPoint.getArgs()));
    }
}

3.编写Spring配置文件,对业务方法进行增强处理

<bean id="logBuffer" class="cn.smbms.aop.LogBufferAop"/>
    <!-- 定义切面、连接点、目标对象、织入... -->

    <!-- 将处理增强的对象与目标对象结合起来 -->
    <aop:config>
        <!-- 切入点,定义要被增强的方法的表达式 -->
        <aop:pointcut id="pointcut" expression="execution(public boolean addUser(cn.smbms.pojo.User))"/>
        <!-- 前置增强 -->
        <aop:aspect ref="logBuffer">
            <aop:before method="before" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>

被增强的方法

public class UserServiceImpl {


    public boolean addUser(User user){
        System.out.println("service中添加用户成功....");
        return true;
    }
}

4.编写代码获取带有增强处理的业务对象

servlet中的方法
private UserServiceImpl userService;

    public void doPost(){
        User user = new User(1,"admin");
        boolean isSuccess = userService.addUser(user);
        System.out.println("servlet中添加用户的请求成功?" + isSuccess);
    }



测试调用servlet中的方法
@Test
    public void testServlet(){
        UserServlet userServlet = act.getBean("userServlet", UserServlet.class);
        userServlet.doPost();
    }

定义切入点

切入点表达式标准格式︰动作关键字(访问修饰符    返回值﹑包名.类/接口名.方法名(参数)异常名)

execution (public User com.demo.service.UserService.findById (int) )

动作关键字︰描述切入点的行为动作,例如execution表示执行到指定切入点

访问修饰符: public , private等,可以省略

异常名︰方法定义中抛出指定异常,可以省略

表达式匹配规则举例

public * addNewUser(entity.User): “*”表示匹配所有类型的返回值。
public void *(entity.User): “*”表示匹配所有方法名。
public void addNewUser(..): “..”表示匹配所有参数个数和类型。
* com.service.*.*(..):匹配com.service包下所有类的所有方法。
* com.service..*.*(..):匹配com.service包及其子包下所有类的所有方法

 切入点书写规范:

1、所有代码按照标准规范开发,否则以下技巧全部失效

2、描述切入点通常描述接口,而不描述实现类

3、访问控制修饰符针对接口开发均采用public描述(可省略访问控制修饰符描述)

4、返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述

5、包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配

6、接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业务层

接口名方法名书写以动词进行精准匹配,名词采用*匹配,例如getByld书写成getBy*;,selectAll书写

成selectAll

7、参数规则较为复杂,根据业务方法灵活调整

8、通常不使用异常作为匹配规则
 

异常抛出增强的特点

在目标方法抛出异常时织入增强处理

可拔插的异常处理方案

<aop:after-returning>后置增强

<aop:aspect ref="theLogger">
      <aop:after-returning method="afterReturning" pointcut-ref="pointcut"                    
         returning="result"/>
</aop:aspect>

<aop:after-throwing>元素:定义异常抛出增强

<aop:aspect ref="theLogger">
        <aop:after-throwing method="afterThrowing"
                pointcut-ref="pointcut" throwing="e" />
</aop:aspect>

<aop:after>最终增强

<aop:aspect ref="theLogger">
        <aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>

特点:

无论方法是否抛出异常,都会在目标方法最后织入增强处理,即:该增强都会得到执行

类似于异常处理机制中finally块的作用,一般用于释放资源

可以为各功能模块提供统一的,可拔插的处理方案

<aop:around>环绕增强

<aop:aspect ref="theLogger">
       <aop:around method="around" pointcut-ref="pointcut"/>
</aop:aspect>

特点:

目标方法前后都可织入增强处理

功能最强大的增强处理

可获取或修改目标方法的参数、返回值,可对它进行异常处理,甚至可以决定目标方法是否执行

常用增强处理类型

增强处理类型特点
Before

前置增强处理,在目标方法前织入增强处理

AfterReturning

后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理

AfterThrowing

异常增强处理,在目标方法抛出异常后织入增强处理

After

最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理

Around

环绕增强处理,在目标方法的前后都可以织入增强处理

Spring AOP配置元素

AOP配置元素描述

<aop:config>

AOP配置的顶层元素,大多数的<aop:*>元素必须包含在<aop:config>元素内

<aop:pointcut>

定义切点

<aop:aspect>

定义切面

<aop:after>

定义最终增强(不管被通知的方法是否执行成功)

<aop:after-returning>

定义after-returning增强

<aop:after-throwing>

定义after-throwing增强

<aop:around>

定义环绕增强

 <aop:before>

定义前置增强

<aop:aspectj-autoproxy>

启动@AspectJ注解驱动的切面

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

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

相关文章

MEE: A Novel Multilingual Event Extraction Dataset 论文解读

MEE: A Novel Multilingual Event Extraction Dataset paper&#xff1a;[2211.05955] MEE: A Novel Multilingual Event Extraction Dataset (arxiv.org) code&#xff1a;None 期刊/会议&#xff1a;EMNLP 2022 摘要 事件抽取&#xff08;EE&#xff09;是信息抽取&#…

OS_用户层的IO软件@缓冲区@磁盘高速缓存@异步IO

文章目录OS_用户层的IO软件缓冲区磁盘高速缓存异步IO用户层的IO软件&#x1f388;1.系统调用2.库函数高速缓存与缓冲区磁盘高速媛存(Disk Cache)缓冲区Buffer缓冲的用途设备速度的巨大差异&#x1f388;缓冲和缓存的比较联系区别缓冲区的结构缓冲的引入单缓冲区和双缓冲区单缓冲…

万应视野|蔡鑫莹:One in All,低代码平台从工具向商业的转变

2015年&#xff0c;AI、5G、大数据、云计算等前沿技术开始崭露头角&#xff0c;软件再出发、工业互联网等相关政策逐渐出台&#xff0c;云畅的悠悠创业路自此竟也走过了8年。 风华绝代总爱乱世生。2020年&#xff0c;百年变局与世纪疫情交织&#xff0c;经济全球化遭遇逆流&…

倾斜摄影模型数据在gis中的应用

倾斜摄影是近年来航测领域逐渐发展起来的新技术&#xff0c;可同时获得同一位置多个不同角度的、具有高分辨率的影像&#xff0c;采集丰富的地物侧面纹理及位置信息&#xff0c;批量建立高质量、高精度的三维GIS模型&#xff0c;对市政、轨道交通、水利水电、智慧城市等各工程领…

一个简单的HTML篮球网页【学生网页设计作业源码】

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

大比分领先!ACCV 2022 国际细粒度图像分析挑战赛冠军方案

写在前面 在刚刚结束的 ACCV 2022 国际细粒度图像分析挑战赛中&#xff0c;我们团队在 133 支参赛队伍中脱颖而出&#xff0c;在 Leadboard-B 上以 2.5 的绝对优势取得冠军。 比赛成绩截图 在比赛过程中&#xff0c;我们使用了一些对细粒度分类十分有效的解决方案。 例如&am…

服务器渲染技术-->Thymeleaf

目录 一.基本介绍 1.Thymeleaf 是什么 2.Thymeleaf 的优点 3. Thymeleaf 的缺点 二.Thymeleaf 机制说明 三.Thymeleaf 语法 1. 表达式 1. 表达式一览 2. 字面量 3. 文本操作 2.运算符 1. 数学运算 2. 布尔运算 3. 比较运算 4. 条件运算 3.th 属性 4.迭代 5.条…

PLC模拟量传输过程

网上对PLC模拟量的一些解释含糊不清&#xff0c;令参考人疑惑重重&#xff0c;搞不懂现场—>PLC—>上位机的过程走向。 . 应该了解什么是数字量&#xff1f;什么是模拟量&#xff1f;下面是我的理解。 数字量&#xff1a;没有单位&#xff0c;表示一个数字&#xff0c;0~…

Linux-iNode-软硬链接

文章目录inode磁盘了解站在OS角度磁盘就是线性结构如何确认inode和后面的那个block相关联呢&#xff1f;如何在大的inode Table中安排一个新文件的inode?目录下创建文件的过程都发生了什么软硬链接软链接&#xff1a;特别像快捷方式使用场景硬链接二者区别&#xff1a;硬链接有…

nodejs+vue+element+eachers构建开源项目大型连续剧(1)搭建nodejs服务器

在前端开发过程中&#xff0c;可能某些时候需要自己搭建一台服务器用于一些文件图片请求或者进行后端相关知识的学习。本文主要讲解如何通过nodejs进行一个基础服务器的搭建&#xff0c;包括如何将文件布置的服务器&#xff0c;以及基础接口的开发。后面可能会更新关于通过node…

从根源帮助改变数据延误, Qlik 辅助金融行业实现信贷渠道预测

信贷行业面临的业务挑战 传统方式下&#xff0c;营利性增长和正确管理信贷组合风险的能力是通过静态报告和电子表格完成的&#xff0c;不仅数据单独进行汇总&#xff0c;同时交付过程也存在延迟。这种情况导致组织不得不基于不完整的信息来制定关键的信贷和定价决策。信贷员需…

研发中台拆分过程的一些心得总结

背景在 21 年&#xff0c;中台拆分在 21 年&#xff0c;以下为中台拆分的过程心得&#xff0c;带有一定的主观&#xff0c;偏向于中小团队中台建设参考&#xff08;这里的中小团队指 3-100 人的团队&#xff09;&#xff0c;对于大型团队不太适用&#xff0c;毕竟大型团队人中 …

Elasticsearch8系列【2】Windows环境安装ES8

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言Windows安装Elasticsearch8.5.21. 下载2. 获取密码3. 注册服务4. 登录安装可视化工具前言 Elasticsearch使用Java语言开发&#xff0c;在安装之前需要安装JDK环境。基本支持所有主流操作系统…

Kioptrix Level2靶机

0x01信息收集 nmap -sV -O 10.121.65.83 0x02 万能密码&&命令执行 访问80端口(经测试 443端口并没有办法访问) 登录框尝试弱口令和sql注入 发现存在万能密码 admin# 存在一个ping命令&#xff0c;尝试通过管道符看是否会执行命令 127.0.0.0|id 存在命令执行漏洞&am…

network判断是否瓶颈

首先判断连接是否建立&#xff1a; tcp主机a->主机b的请求连接命令&#xff0c;半连接队列在主机b 判断半连接队列命令 netstat -s |grep -i listen 值过大&#xff0c;半连接队列无法建立 2.tcp主机a收到主机b的回复&#xff0c;主机a->主机b的连接请求&#xff0c;全…

成才之路杂志社成才之路编辑部成才之路杂志2022年第33期目录

高教与成才研究《成才之路》投稿&#xff1a;cn7kantougao163.com 融媒体时代大学生职业发展与就业指导课程体系建设研究 张效良;李玉波; 1-4 “三全育人”背景下高职辅导员思政教育方法研究 杨春蕊; 5-8 “五育”学生管理模式对高校思政教育的影响研究 张晓英; 9-…

基数排序python

一、基数排序介绍 基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顾名思义&#xff0c;它是透过键值的部份资讯&#xff0c;…

【Windows逆向】Windows进程动态patch入门+pyqt5搭建GUI

目标 希望学习对Windows进程的动态patch&#xff0c;我们选择的exe是buuoj的“不一样的flag”。这题是迷宫题的hello world&#xff0c;没有加壳&#xff0c;没有任何代码混淆&#xff0c;且可以把它当成一个超小型的游戏&#xff0c;有助于提升信心。 为了直观&#xff0c;以…

【学习笔记】SAP固定资产的减值功能

SAP固定资产的减值功能 若固定资产出现减值迹象&#xff0c;也就是固定资产的可收回金额小于账面价值时&#xff0c;就要计提固定资产减值准备。 分录&#xff1a; 借&#xff1a;资产减值损失&#xff08;损益科目&#xff09; 贷&#xff1a;固定资产减值准备&#xff08;资…

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 从功能测试进阶自动化测试&#xff0c;熬夜7天整理出这一份超全学习指南【附网盘资源】 大家应该都有同一种感觉&…