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

Spring的AOP

核心:

AOP(Aspect-Oriented Programming)面向切面编程是一种思想,动态代理是面向切面编程的一种实现方式。AOP是OOP(面向对象编程)的延续。

父子类,用cglib动态代理。

接口,用jdk的动态代理。

Spring,用proxyFactory,整合了上面两种,父子类回去用cglib,接口类会去用jdk的动态代理。

Spring多用注解,注解spring使用AspectJ的注解,但实现是自己实现的,aspectj是在编译的时候把代理的内容直接在字节码文件中生成,spring不是,spring是在运行中用自己的实现方式弄的。

aop核心概念

aspect:切面,定义pointcut、advice等。如spring aop中@aspect所在的类

pointCut:切点。需要代理的类与方法。如spring aop中@Before后的就是pointcut

advice:代理的代码,即需要补充的代码。spring aop中有5中advice,@before、@after@afterReturning、@afterThrowing、@around。每个注解都对应一个实际的执行类,如@Before对应AspectJMethodBeforeAdvice类

在spring中的实现,如下:

cglib动态代理:

jdk的动态代理:

proxyFactory:

其他编程范式

除了AOP(面向切面编程)之外,还有多种编程范式,它们各自具有不同的特点和应用场景。以下是一些常见的编程范式:

  1. 命令式编程(Imperative Programming)
    • 特点:以指令的形式描述计算机执行的具体步骤,关注计算机的状态变化和控制流程。
    • 典型代表语言:C、Java、Python(在一定程度上)等。
    • 描述方式:通过一系列的语句改变程序的状态,以实现特定的计算目标。
  2. 面向对象编程(Object-Oriented Programming, OOP)
    • 特点:将程序组织为对象的集合,对象封装了数据(属性)和行为(方法或函数),强调数据和操作的封装、继承和多态。
    • 典型代表语言:Java、C++、Python、Ruby、C#等。
    • 优点:提高了代码的可重用性、可维护性和可扩展性。
  3. 函数式编程(Functional Programming, FP)
    • 特点:将计算视为数学函数的求值,强调使用纯函数、不可变数据和高阶函数。
    • 典型代表语言:Haskell、Clojure、Scala等,以及JavaScript、Python、Scala等语言中的某些功能。
    • 优点:代码更简洁、易于测试和调试,适合并行处理。
  4. 声明式编程(Declarative Programming)
    • 特点:强调描述问题的状态和关系,而不是明确指定如何解决问题。它包括逻辑编程、函数式编程、数据流编程等多种形式。
    • 典型代表语言:Prolog(逻辑编程)、SQL(数据流编程)、HTML/CSS(在一定程度上)等。
    • 优点:使代码更易于理解和维护,特别是在处理复杂逻辑和数据流时。
  5. 逻辑编程(Logic Programming)
    • 特点:使用逻辑表达式描述问题和解决方案,基于逻辑推理进行计算。
    • 典型代表语言:Prolog。
    • 应用场景:主要用于人工智能、专家系统和自然语言处理等领域。
  6. 并发编程(Concurrent Programming)
    • 特点:处理多个同时执行的计算,关注并发性和并行性。
    • 典型代表语言:Java(通过多线程)、Go、Erlang等。
    • 应用场景:适用于需要高性能和多任务处理的应用程序,如服务器、并行处理和高性能计算等。
  7. 泛型编程(Generic Programming)
    • 特点:通过参数化类型来实现代码的复用和抽象,提供通用的数据结构和算法。
    • 典型代表语言:C++(模板)、Rust等。
    • 优点:提高了代码的可重用性和灵活性。
  8. 反应式编程(Reactive Programming)
    • 特点:通过异步数据流来构建响应式系统,使得系统能够根据数据流的变化做出响应。
    • 典型代表框架:RxJava、Reactor等。
    • 应用场景:适用于需要处理大量数据流和事件流的应用程序,如实时数据分析、Web应用等。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ASP.NET Core----基础学习06----将所有数据在页面中显示 布局页面的使用
  • 基于Faster R-CNN的安全帽目标检测
  • Redis分布式锁-Redisson可重入锁原理的个人见解。
  • 【全面介绍Pip换源】
  • 【密码学】密码学数学基础:剩余系
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架
  • Vue3 前置知识
  • 基于hive数据库的泰坦尼克号幸存者数据分析
  • starRocks搭建
  • 14、Python之super star:一颗星、两颗星,满天都是小星星
  • Rust 版本升级:rustup update stable 报错
  • 2300. 咒语和药水的成功对数
  • BUUCTF逆向wp [MRCTF2020]Transform
  • 【Linux】多线程_7
  • Spring解决循环依赖:三级缓存
  • 【comparator, comparable】小总结
  • Angular2开发踩坑系列-生产环境编译
  • Angular数据绑定机制
  • echarts花样作死的坑
  • HashMap ConcurrentHashMap
  • JS 面试题总结
  • mysql 5.6 原生Online DDL解析
  • PAT A1050
  • session共享问题解决方案
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Spring Cloud中负载均衡器概览
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 异常机制详解
  • 最近的计划
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 树莓派用上kodexplorer也能玩成私有网盘
  • $forceUpdate()函数
  • (35)远程识别(又称无人机识别)(二)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)Flink 窗口计算
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (算法)Travel Information Center
  • (五)c52学习之旅-静态数码管
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)jQuery 基础
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .net core Swagger 过滤部分Api
  • .NET WPF 抖动动画
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .ui文件相关
  • @Transactional 竟也能解决分布式事务?
  • [ solr入门 ] - 利用solrJ进行检索
  • []T 还是 []*T, 这是一个问题
  • [1181]linux两台服务器之间传输文件和文件夹