【Spring】初识 Spring AOP(面向切面编程)

目录

1、介绍AOP

1.1、AOP的定义

1.2、AOP的作用

1.3、AOP的核心概念及术语

2、AOP实现示例

3、@EnableAspectJAutoProxy注解

1、介绍AOP

1.1、AOP的定义

        AOP(Aspect Orient Programming),直译过来就是面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

1.2、AOP的作用

作用:AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。

主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。

简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。

AOP的经典应用场景有:日志记录、事务管理、权限验证、性能监测

AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

1.3、AOP的核心概念及术语

目标对象(Target):目标对象指将要被增强(比如增强功能)的对象,或者说被一个或多个切面所通知的对象,即包含主业务逻辑的类的对象,即为目标对象。

可以说要增强的对象(通常会有很多个)就是目标对象

切面(Aspect):指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中,切面可以使用通用类基于模式的方式(schema-basedapproach)或者在普通类中以@Aspect注解(@Aspect注解方式)来实现。

可以说增强代码放入的那个类就叫切面类,由@Aspect注解来标识

通知(Advice):在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”,“before” 和“after”等等。通知的类型将在后面详细了解。许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。

用来放增强的代码的那个方法就是通知

  • 环绕通知@Around:可以把代码增强在目标方法的任意地方,更通用
  • 前置通知@Before:目标方法之前执行
  • 后置通知@After:目标方法之后执行
  • 异常通知@AfterThrowing:目标方法出现了异常执行
  • 返回通知@AfterReturning:目标方法返回值执行

切点(Pointcut):匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用Aspectj切点语义。

增强代码要对哪些类中的哪些方法进行增强,进行切割,指的是被增强的方法,即要切哪些东西。切点表达式

连接点(Join point):在Spring AOP中,一个连接点总是代表一个方法的执行,其实就代表增强的方法。

连接点就是通知和目标方法的一个桥梁,可以获取到目标方法的信息,就得通过JoinPoint

顾问(Advisor):顾问是Advice的一种包装体现,Advisor是Pointcut以及Advice的一个结合,用来管理Advice和Pointcut。应用无需关心.

顾问是源码中的体现,会封装切点和通知

织入(Weaving):将通知切入连接点的过程叫织入,就是我这个增强代码织入到目标方法或者叫切入到目标方法都可以

2、AOP实现示例

        假设有一个类的所有业务功能都已经实现,但是最后我想在所有的功能里面加一个公共的功能(记录所有的请求的用时), 这时候就可以利用AOP来实现,切面就是(需要增强的公共的、跟业务没有关系的公共代码)。可以在不改变原有业务代码的基础上进行了增强。所以面向切面编程往往让我们的开发更加低耦合,也大大减少了代码量,同时呢让我们更专注于业务模块的开发,把那些与业务无关的东西提取出去,便于后期的维护和迭代。

如何在Spring中创建一个所谓切面?

切面里面的代码怎么运行在业务方法(运行在之前、运行在之后)

使用AOP需要引入依赖

<!--以spring-boot-starter为前缀的依赖都是springboot官方提供的依赖,
不需要自己来指定版本,因为parent都帮我们管理好了,
springboot通过这种方式统一管理了版本,可以减少版本的冲突-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

aspectj:AOP概念并不是spring独家提出来的,AOP早就有成熟框架已经实现了,aspectj就是一个成熟的AOP的解决方案,spring只不过是把aspectj集成进来了

AOP实现示例代码:@Aspect注解可以把一个类标记为切面类

自定义类UserService,假设其所有业务功能(增删查改)都已经实现,但是我想给这些功能加一个记录请求用时的功能。这时用AOP来实现

//自定义类UserService,假设其所有业务功能都已经实现
@Service
public class UserService {

    // 增加增删改查方法,这里就用一个打印语句来代替具体的方法功能了
    public void add(){
        System.out.println("增加");
    }

    public void delete(){
        System.out.println("删除");
    }

    public void update(){
        System.out.println("修改");
    }

    public void query(){
        System.out.println("查询");
    }
}


//切面类LogAspect,通过这个切面类来实现在所有的功能里面加一个公共的功能(记录所有的请求的用时)
@Aspect  //把这个类标记为切面类
@Component  //切面类必须声明为Spring的bean
public class LogAspect, {

    // execution(* com.lt.UserService.*(..)) 切点表达式
    // @Around 环绕通知
    @Around("execution(* com.lt.UserService.*(..))") //切点表达式
    public void log(ProceedingJoinPoint proceedingJoinPoint){
        //记录方法用时
        long begin = System.currentTimeMillis();

        // 执行具体的方法
        try {
            proceedingJoinPoint.proceed();
        } catch (Throwable e){
            System.out.println("方法执行异常:" + e.getMessage());
        }

        long end = System.currentTimeMillis();

        System.out.println("方法用时:" + (end - begin) + "ms");
    }

}


//测试类C4AopApplicationTests
@SpringBootTest(classes = C4AopApplicationTests.class)
@ComponentScan
class C4AopApplicationTests {

	@Test
	void contextLoads(@Autowired UserService userService) {
		userService.add();
	}
    
}

运行结果:

3、@EnableAspectJAutoProxy注解

1、@EnableAspectJAutoProxy:启用AOP,没有这个注解AOP功能无法使用

如果要使用SpringAOP的功能,必须要添加一个@EnableAspectJAutoProxy注解,有了这个注解才能支持@Aspect等相关的一系列AOP注解的功能,这个注解就相当于在传统的xml配置文件中添加 <aop:aspectj-autoproxy>一样。

2、@EnableAspectAutoProxy不是一定要加的

比如上面的AOP示例,为什么没有加@EnableAspectJAutoProxy注解,AOP也起作用了?

这是因为SpringBoot其实会通过启动类自动帮我们加上@EnableAspectJAutoProxy,所以可以省略。(@SpringBootApplication这个注解帮我们做了很多的事情,包括自动帮我们加上@EnableAspectJAutoProxy注解)

//测试类C4AopApplicationTests
@SpringBootTest(classes = C4AopApplicationTests.class)
@ComponentScan
class C4AopApplicationTests {
    ......
}

//启动类
@SpringBootApplication // 由于这个注解起了作用,所以自动加了@EnableAspectJAutoProxy
public class C4AopApplication {
    ......
}

所以com.lt包下的启动类C4AopApplication和他上面的上面的注解@SpringBootApplicatio也会被扫描到,由于这个注解起了作用,所以自动加了@EnableAspectJAutoProxy

但是依然建议加上@EnableAspectJAutoProxy,因为在Spring中没有这个注解AOP功能会无法使用。

 推荐:

【Spring】IOC/DI中常用的注解@Lazy、@Scope与@Conditional-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138277932?spm=1001.2014.3001.5501

【Spring】IOC/DI中常用的注解@Order与@DependsOn-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138167160?spm=1001.2014.3001.5501

【spring】Bean的生命周期回调函数和Bean的循环依赖-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138503989?spm=1001.2014.3001.5501

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大型模型技术构建本地知识库

使用大型模型技术构建本地知识库是一个复杂的过程&#xff0c;涉及到数据科学、机器学习和软件工程等多个领域的知识。以下是构建本地知识库的一般步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析&#xff1a; 确定知…

软件工程经济学--期末复习资料

软件工程经济学--期末复习资料 前言第一章 绪论第二章 软件工程经济学基础第三章 软件的成本管理与定价分析第四章 软件工程项目评价方法与经济效果评价第五章 软件生产函数、效益分析及不确定性分析第六章 软件工程项目进度计划的制定结尾总结 前言 软件工程经济学&#xff0…

书生作业:XTuner

作业链接&#xff1a; https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md xtuner: https://github.com/InternLM/xtuner 环境配置 首先&#xff0c;按照xtuner的指令依次完成conda环境安装&#xff0c;以及xtuner库的安装。 然后&#xff0c;我们开始尝试…

VBA信息获取与处理第四节:获取唯一非重复值返回数组的代码

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

scanf留下的那一片云彩

【题目描述】 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&#xff09;&#xff0c;统计得分。每个O的得分为目前连续出现的O的个数&#xff0c;X的得分为0。例如&#xff0c;OOXXOXXOOO的得分为1200100123。 输入第一行表示有n个字符串&#xff0c;后续是n行字…

【matlab基础知识代码】(十八)无约束最优化问题

min下面的x称为优化向量或者是决策变量 匿名函数法 >> f(x)(x(1)^2-2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2)); x0[0; 0]; [x,b,c,d]fminsearch(f,x0), x 0.6111 -0.3056 b -0.6414 c 1 d 包含以下字段的 struct: iterations: 72 funcCount: 137 algor…

Hive SQL-DML-insert插入数据

Hive SQL-DML-insert插入数据 1. 插入静态数据 可以直接插入具体的值到Hive表中&#xff1a; INSERT INTO TABLE tablename (column1, column2, column3) VALUES (value1, value2, value3),(value4, value5, value6),...;2. 插入查询结果 将一条查询的结果直接插入到另一个表中…

软件工程基础知识,软考选择题的重点

本篇知识来自&#xff1a;软件设计师考试同步辅导 ---考点。。。。。&#xff0c;钟彩华 博伟玉 清华出版社&#xff0c;那本书。仅供学习。以下理解都是本人自己认为的。仅供参考。 本书的第132页&#xff0c;第五章知识。 目录 软件工程叙述 软件的生命周期 软件过程 软…

android studio配置Http Proxy

1、问题描述&#xff1a; Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request” 解决&#xff1a;HTTP Proxy设置 1.File→Settings…→System Settings → HTTP Proxy → Auto-detect proxy settings”&#xff1b; 2.勾选下方“Automatic prox…

Codigger:Vim的革新者,提升开发体验和功能性

深知Vim在编程和文本编辑领域的卓越地位&#xff0c;因此&#xff0c;在设计和开发过程中&#xff0c;Codigger始终将保留Vim的核心功能和高度定制能力作为首要任务。然而&#xff0c;Vim的复杂性和高度定制性也让很多新用户望而却步。为了降低这种使用门槛&#xff0c;Codigge…

常用Linux命令详细总结

一、文档编辑、过滤、查看命令 1、cp 复制文件和目录 -a 复制文件并保持文件属性 -d 若源文件为链接文件&#xff0c;则复制链接文件属性而非文件本身 -i 覆盖文件前提示&#xff0c;如果不要提示&#xff0c;在命令前加上\ -r 递归复制&#xff0c;通常用于目录的复制 …

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况&#xff1f;2. 解决方案方法一&#xff1a;使用 fuser 命令方法二&#xff1a; 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时&#xff0c;我们有时会发现虽然没有可见的进程在执行&#xff0c;但GPU资源却意外地被占用。这种情况往往会阻碍…

揭秘LLMOps,高效开发大型语言模型

大家好&#xff0c;随着人工智能&#xff08;AI&#xff09;的蓬勃发展&#xff0c;一个新兴领域语言模型运维&#xff08;LLMOps&#xff09;正逐渐成为关注的焦点。LLMOps专注于对大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;进行全…

ESP32重要库示例详解(一):EEPROM之Preferences库

1. 了解EEPROM 在嵌入式系统开发中&#xff0c;断电后晚能存储少量数据是常见需求。EEPROM&#xff08;Electrically Erasable Programmable Read-Only Memory&#xff09;是一种非易失性存储器&#xff0c;即使断电数据也不会丢失。ESP32的EEPROM模拟功能利用闪存空间&#x…

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…

时间范围交集查询

业务场景&#xff1a; 数据库中时开始时间与结束时间&#xff0c;筛选数据条件将这两个字段&#xff08;开始时间、结束时间&#xff09;糅合成一个字段&#xff0c;并且是范围筛选。 数据库字段&#xff1a; 筛选条件&#xff1a; 数据分析 全部包含&#xff08;子集&#…

WorkPlus im(即时通讯)集成平台助力政企数字化转型升级

随着互联网技术的不断发展&#xff0c;企业内部通讯软件已经成为企业日常运营中不可或缺的一部分。企业IM&#xff08;即时通讯&#xff09;和移动门户作为企业内部通讯软件的关键组成部分&#xff0c;为企业提供更加高效、便捷的通讯方式&#xff0c;提高了企业的运营效率。 针…

共绘财富管理新蓝图,ATFX赞助出席拉美峰会,引领家族资本新航向

全球新兴市场中&#xff0c;拉丁美洲以其非凡活力与潜力格外引人注目&#xff0c;成为全球资本竞相追逐的价值洼地。ATFX自2019年开设墨西哥办事处以来&#xff0c;持续深耕拉美市场已成为头部品牌。自4月行业资深人士Ergin Erdemir掌舵拉美业务后&#xff0c;掀起市场营销新浪…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …

选型前必看,西门子五大系列PLC的区别及特点

西门子是全球知名的自动化解决方案提供商&#xff0c;其PLC&#xff08;可编程逻辑控制器&#xff09;系列产品广泛应用于工业控制领域。不同系列的PLC在功能、性能和适用范围上有所区别。本文将详细介绍西门子PLC各个系列的特点和区别&#xff0c;以及在实践应用时如何采用无线…