软考系统架构设计师 - 第 18 章 面向切面编程

涉及单选题。已阅第18小时和教程

18.1 切面编程的概念

AOP主要的贡献在于在某一方面提供了一种融合代码的方式,否则这些代码会分散在整个应用程序中。

切面的定义:一个设计用来捕获应用程序横切面的程序单位。一个切面通常描述为一个横切程序的结构。

切面的组成:切入点、通知代码。切入点定义了程序中要执行的代码处的点。通知代码包括要执行的代码。

AOP可以说是OOP的补充和完善。OOP引入封装、继承和多态等概念来建立一种对象层次结构,用以模拟公开行为的一个集合。当需要为分散的对象引入公共行为,OOP则显得无能为力。也就是说,OOP允许定义从上到下的关系,但并不适合定义从左到右的关系。比如日志功能。

而AOP技术恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect。

使用“横切”技术,AOP把软件系统分成两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的是横切关注点。

横切关注点的一个特定是,常常发生在核心关注点的多处,且各处都基本相似,例如权限认证、日志、事务处理。

实现AOP的技术分类:

  • 动态代理技术:利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
  • 静态织入:引入特定语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码

实现AOP的技术概念:

  • join point:连接点,是程序执行中的一个精确执行点,例如类中某个方法。它是抽象的概念,在实现AOP时,不需要去定义一个join point。
  • point cut,切入点。本质上是捕获连接点的结构。在AOP中,可以定义一个切入点,来捕获相关方法的调用。
  • advice,通知/增强。是切入点的执行代码,是执行切面的具体逻辑。
  • aspeect,切面。是切入点和通知的结合。
  • introduce,引入。为对象引入附件的方法或属性,从而达到修改对象结构的目的。

AOP的特性:

  • 可扩展性
  • 可重用性
  • 易理解性和易维护性

AOP程序的结构:

  • 一种编程语言
  • 特定于这种语言的编译器
  • 利用这种语言编写的应用程序

基于AOP的系统实现也有上面三个部分,但是AOP中有了动态aspect的概念,所以细分为如下:

  • 一种组件语言,一种或多种aspect语言
  • 一个用来合并两者的aspect编织器(weaver)
  • 利用组件语言实现的系统组件,利用aspect实现的aspect组件

AOP程序设计步骤:

  • 对需求进行功能性分解、区分出核心关注点和横切关注点
  • 完成每个关注点的编码及实现,构造系统组件和系统aspect
  • 用连接器指定重组规则,将组件代码和aspect代码进组合,形成最终的系统

当前的AOP技术:AspectJ、AspectWerkz、JBoss AOP、Spring AOP

  • 语法方面:AspectJ对Java语言进行的扩展,其它都是不改变Java语法的情况下加入了切面语义
  • 声明方式方面:AspectJ在代码中对切面进行声明。AspectWerkz和JBoss AOP支持用元数据对Java代码进行注解或者在独立XML中对切面进行声明。Spring AOP则完全使用XML对切面进行声明(现在在Java代码中也可以),相比于AspectWerkz和JBoss AOP,Spring AOP提供了更加精细的配置
  • 性能方面:AspectJ通过编译时对目标二进制类的增强获得面向切面的能力,在编译时会有开销,但是运行时会获得更快的速度。JBoss AOP和Spring AOP是基于拦截技术,所以在运行时需要开销。对比之下,AspectJ构建开销最大,AspectWerkz次之,JBoss AOP再次,Spring AOP没有构建时开销

18.2 AspectJ

AspectJ既是一个语言规范,又是一个AOP语言实现。

AspectJ的语言构造是从Java语言中扩展而来的,因此所有合法的Java程序也是合法的AspectJ程序。

AspectJ是已知最好的,并且应用最广泛的AOP实现。

18.3 Spring AOP

Spring的AOP包提供与AOP联盟兼容的面向切面编程实现,允许定义,如方法拦截器和切点,来干净地从逻辑说应该被分离的功能实现代码解析。使用源码级元数据功能,可将各种行为信息合并到代码中。

AOP在Spring中的使用:声明式切面事务、自定义切面等。

已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页