Spring 面向切面

本贴最后更新于 3242 天前,其中的信息可能已经沧海桑田

 

  • 在软件开发中,散布在应用中多处的功能被称为横切关注点 cross-cutting concern,通常横切关注点(如日志)从概念上是与应用的业务逻辑相分离,却又嵌入在业务逻辑中。把横切关注点与业务逻辑相分离正是面向切面编程 AOP 所要解决的问题。

  • 面向切面编程时,在一个地方定义通用功能,通过声明的方式定义这个功能以何种方式在何处应用,而无需修改被影响的类。横切关注点可以被模块化为特殊类,称为切面 aspect

  • 在 AOP 术语中,切面的工作被称为通知,定义了切面要完成的工作何时执行

  • Spring 切面支持 5 种类型的通知:前置通知 Before后置通知 After返回通知 After-Returning异常通知 After-throwing环绕通知 Around

  • 连接点是应用执行过程中能够插入切面的一个点,这个点可以是调用方法时抛出异常时、甚至修改一个字段时

  • 切点是通知所要织入的一个或多个连接点。

  • 切面通知和切点的结合,通知和切点共同定义了切面的全部内容,何时在何处完成何种工作。

  • 引入为向现有类添加新的方法或属性。

  • 织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点(切点)被织入到目标对象中。

  • Spring 提供了 4 种类型的 AOP 支持:基于代理的经典 Spring AOP纯 POJO 切面@AspectJ 注解驱动的切面注入式 AspectJ 切面

  • 借助 Spring 的 aop 命名空间可以将纯 POJO 转换为切面,遗憾的是这种方式只能通过 xml 配置。

  • 注解驱动的 AOP 本质上依然是 Spring 基于代理的 AOP,编程模型几乎与 AspectJ 注解切面完全一致,好处在于可以不使用 xml 配置。

  • 如果 AOP 需求超过了简单的方法调用,如构造器或属性拦截,可以使用 AspectJ 来实现切面。

  • 在 Spring AOP 中使用 AspectJ 的切点表达式语言来定义切点。进一步了解 AspectJ 和 AspectJ 切点表达式语言,可以看 Ramniva Laddad 编写的《AspectJ in Action》。

  • 切点表达式 execution (* package.class.function(..) && within(package.*)) 。第一个 * 表示任意返回类型,.. 表示使用任意参数,&&表示"与"关系,xml 中可以使用and,类似 || 可以使用 or! 可以使用 not

  • Spring 中引入了一个新的 bean 指示器,用来指定 bean 的 ID,如 execution (* package.class.function(..) && bean("beanID")) 限制切点只匹配特定的 bean,也可以在 bean()指示器前添加!表示除特定 ID 以外的其他 bean

  • @AspectJ 注解用来定义切面,在类的方法上使用定义通知的注解。AspectJ 提供了 5 个注解来定义通知:@After@AfterReturning@AfterThrowing@Around@Before。定义通知的注解需要给定一个切点表达式作为它的值。

  • @PointCut 注解能够在一个@AspectJ 切面内定义可重用的切点。使用时在一个方法上添加注解,将切点表达式作为注解的值,方法为注解提供依附,方法名 function() 可在其他需要切点表达式的地方代替切点表达式。

  • JavaConfig 中,可以在配置类的级别上通过 @EnableAspectJAutoProxy 注解启动 @AspectJ 的自动代理功能。xml 中使用 <aop:aspectj-autoproxy />

  • 环绕通知是最强大的通知类型,方法中需要有 ProceedingJoinPoint 参数(jp),并添加 @Around 注解。在方法体中,jp.proceed() 表示切点,可以围绕它编写各种通知。如果不调用 proceed(),通知实际上会阻塞被通知方法的调动

  • 对于有参数的通知,需要在切点表达式的方法中指定接受参数的类型,并通过 args(paramName)限定符匹配参数名称。例如 execution(* package.class.function(int) && args(paramName))

  • Java 不是动态语言,但是可以利用 AOP 中的"引入"概念,通过切面为 Spring bean 添加新方法。

  • 面向注解的切面声明必须要为类添加注解,没有源码时,可通过 xml 配置声明。

  • 大多数 aop 配置元素需要在 <aop:config> 元素的上下文内使用,<aop:aspect ref="beanId"> 声明切面,<aop:pointcut id="pointId" expression="..." /> 定义切点,<aop:before(其他通知类型) pointcut-ref="pointcutId" method="methodName" /> 定义通知。

  • 如果多个切面需要用到相同的切点,可以将 <aop pointcut> 元素放在 <aop:config> 元素的范围内。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3205 引用 • 8217 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖
  • 面向切面
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • V2Ray
    1 引用 • 15 回帖 • 3 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 8 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 569 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    193 引用 • 3964 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 335 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 80 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 482 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 679 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    316 引用 • 547 回帖 • 1 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 422 关注
  • danl
    194 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 176 关注
  • Excel
    31 引用 • 28 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 651 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 253 关注
  • 倾城之链
    23 引用 • 66 回帖 • 181 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 193 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    50 引用 • 192 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 8 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 93 关注
  • 印象笔记
    3 引用 • 21 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 621 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 641 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 454 关注