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

Spring提供的AOP支持是什么

在Spring框架中,AOP(面向切面编程)支持是一种编程范式,它允许开发者将横切关注点(cross-cutting concerns)从它们影响的业务逻辑中分离出来。横切关注点是指那些影响多个类的问题,例如日志记录、事务管理、安全和缓存等。AOP通过定义名为“切面”(aspects)的独立组件来实现这一点,切面中包含了横切逻辑,并且可以在不同的执行点,被动态地“织入”到程序中。

Spring AOP 提供了以下功能和优点:

  1. 切面(Aspect):封装横切逻辑的模块,比如声明要执行什么(advice)以及何时执行(pointcut)。

  2. 连接点(Join Point):程序执行的某个特定位置。在 Spring AOP 中,一个连接点总是代表一个方法的执行。

  3. 通知(Advice):切面在特定连接点采取的动作,它有不同的类型如前置通知(Before)、后置通知(After)、后置返回通知(After-returning)、抛出异常通知(After-throwing)和环绕通知(Around)。

  4. 切入点(Pointcut):匹配连接点的表达式,告诉AOP框架在哪里应用通知(比如所有以“find”开头的方法)。

  5. 引入(Introduction):用于给现有的类添加新方法或属性。

  6. 目标对象(Target Object):被一个或多个切面所通知的对象(即AOP框架生成的代理对象)。

  7. AOP代理(AOP Proxy):AOP框架创建的对象,用于实现切面契约(通知方法执行等)。

在Spring中,AOP 通常是通过带有@Aspect注解的类来实现的,这些类中包含具有诸如@Before@After@AfterReturning@AfterThrowing@Around注解的方法。

示例

以下是一个基本的切面示例,使用了 Spring AOP 的注解:

@Aspect
@Component
public class MyAspect {// 定义切入点@Pointcut("execution(* com.example.service.*.*(..))")public void serviceLayer() {}// 一个前置通知示例@Before("serviceLayer()")public void logBefore(JoinPoint joinPoint) {// 日志记录逻辑...System.out.println("Before executing: " + joinPoint.getSignature().getName());}// 一个环绕通知示例@Around("serviceLayer()")public Object profile(ProceedingJoinPoint pjp) throws Throwable {long start = System.currentTimeMillis();Object output = pjp.proceed(); // 继续执行方法long elapsedTime = System.currentTimeMillis() - start;System.out.println("Method execution time: " + elapsedTime + " milliseconds.");return output;}
}

在上述代码中,注解 @Aspect 标记类 MyAspect 为一个切面,并且 @Pointcut 定义了一个切入点表达式,匹配 com.example.service 包中所有类的所有方法。@Before@Around 注解表示在匹配的方法执行之前和周围执行相应的通知方法。

代理

Spring AOP 默认使用基于JDK的动态代理或CGLIB代理来实现AOP代理。这些代理会在运行时生成,并包装目标对象,织入定制的切面逻辑。

集成

Spring AOP 被设计为与Spring IOC容器紧密集成。AOP代理可以是任何Spring管理的bean,并且可以利用容器提供的服务,例如

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VMware虚拟机设置桥接网络固定IP
  • 社区养老服务小程序的设计
  • 规控面试常见问题
  • 【AI-12】浅显易懂地说一下损失函数
  • css-伪类选择器
  • SpringBoot使用泛型出入参+策略模式+反射+缓存实现统一POST接口入口
  • 连锁企业组网的优化解决方案
  • 通过Java实现插入排序(直接插入,希尔)与选择排序(直接选择,堆排)
  • 12. 计算机网络TCP四次挥手
  • 【avue+vue2+elementui】删除、rules、页面跳转和其他问题
  • 探索编程世界:大学新生入门指南
  • uniapp小程序中富文本内容渲染图片不展示的问题
  • 大模型的一些思考
  • MATLAB(10)分类算法
  • json-server(快速搭建本地 RESTful API 的工具)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Effective Java 笔记(一)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • SAP云平台里Global Account和Sub Account的关系
  • scrapy学习之路4(itemloder的使用)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Spring框架之我见(三)——IOC、AOP
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue学习第二天
  • 和 || 运算
  • 聊聊flink的TableFactory
  • 前端存储 - localStorage
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 译有关态射的一切
  • 因为阿里,他们成了“杭漂”
  • #每天一道面试题# 什么是MySQL的回表查询
  • (1)(1.13) SiK无线电高级配置(六)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (LeetCode 49)Anagrams
  • (九)c52学习之旅-定时器
  • (转)菜鸟学数据库(三)——存储过程
  • (转)关于多人操作数据的处理策略
  • (转)重识new
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 回调、接口回调、 委托
  • .Net中ListT 泛型转成DataTable、DataSet
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • @基于大模型的旅游路线推荐方案
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [20170705]diff比较执行结果的内容.txt
  • [240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [Android] Binder 里的 Service 和 Interface 分别是什么
  • [Android]一个简单使用Handler做Timer的例子
  • [Angular] 笔记 20:NgContent
  • [BFS广搜]迷阵