横切关注点的两种实现方法

软件系统,可看作由一组关注点组成。其中,直接的业务关注点,是直切关注点。而为直切关注点提供服务的,就是横切关注点。

有两种方法可以提供横切关注点,一种是传统的OOP方法,提供一个与直切关注点的实现一样的类来提供服务。另一种是最新的AOP方法,提供一个Aspect方面(Spring AOP中叫advisor顾问)来提供服务。

OOP方式是:业务类使用对象引用,使用“委派”的方式,调用横切类的方法(服务)。

这是“主叫”式的服务。业务类用显示代码来呼叫服务。这在业务类中增加了与“直切关注点”概念无关的代码,破坏了封装性,增加了业务类和服务之间的耦合。

AOP方式是:提供一个Aspect方面,这个方面的概念类似于“类”,它封装了“横切关注点”的实现代码。并且还提供了“切入点”。切入点是“连接点”的集合。切入点就是定义了Aspect方面为哪些类的哪些方法提供服务。

AOP的实现方式有很多种。最早的方式是编译时织入。AspectJ就是使用这种方式。AspectJ的特殊编译器将业务类和Aspect方面的代码组装在一起,从而实现服务的无缝接入。

这种方式,源代码中的业务方法和Aspect方面无关。

另一种很典型、很精巧的实现方式是使用动态代理模拟实现AOP。这是现在最流行的方式。JBoss AOP框架和Spring AOP框架都使用这种方式。

这里我介绍一下Spring AOP框架提供横切关注点服务的方式。编写一个方面,这个方面也是一个一般的pojo类,但是它需要提供一个接口。

然后,使用Advisor顾问(就是方面,是方面+切入点)进行配置,配置接口和切入点模式。在程序运行到连接点方法时,构建一个动态代理类,返回一个谧名的java类,而不是直接使用业务类。这个谧名类组装了业务类和Advise建议(就是方面,SpringAOP的术语)。

由此可见,AOP实现横切关注点的方式要比OOP方式好得多。

而在AOP实现中,我更欣赏Spring AOP 这样运用动态代理模式实现的AOP。这种方式不需要任何辅助工具即可开发AOP。

但是,对于开发AOP也要注意一点:  Spring AOP的advice代码只能够在连接点方法之前、之后调用,或者在异常被抛出之后调用。

这样,就要求我们的目标方法(就是连接点,Advice要捆在它上面)必须够小,要把一个大方法分割成多个小方法。这就需要“重构”技术来帮忙。当然,这不是什么缺点,反而是一个让你养成好习惯的机会。“面向方法重构!”

AOP这种技术的提出是一个了不起的成就。这个技术的始作俑者AspectJ本身的实现技术十分笨拙。

AOP思想实际上是一个软件设计思想的发展,“横切关注点”的发现,使施乐的科学家们创造了AOP这样一种“面向方面(横切关注点)编程”的思想。也使他们生造出了笨拙的怪胎AspectJ。而另一些也在苦苦思索OOP面临问题的一线程序高手,立刻从AOP思想中获得久久寻找中的解决之道。

他们从设计模式中翻出了“动态代理模式”和“装修者模式”,用她们优雅的实现了JBossAOP,SpringAOP这样的pojo型的AOP解决方案!

横切关注点的两种实现方法相关推荐

  1. 什么是 Java 中的 AOP(面向切面编程)?如何使用它来实现横切关注点?

    AOP(Aspect-oriented programming,面向切面编程),是一种编程思想和技术,旨在将横切关注点和主业务逻辑分离,使得系统更容易扩展和维护.在 Java 中,AOP 主要通过代理 ...

  2. day030进程的两种创建方法,验证进程的空间隔离,join等待子进程

    本节内容: 1.操作系统的简单介绍 2.进程的两种创建方法 3.进程之间是空间隔离的, 参考文章: 一.操作系统的简单介绍 1.操作系统简单介绍 操作系统就是一个协调.管理和控制计算机硬件资源和软件资 ...

  3. 【高级React技术】当企业级项目采用Refs 转发和使用 HOC 解决横切关注点问题

    Refs 转发 引用转发是一种通过组件将引用自动传递到其子组件之一的技术.大多数应用程序中的组件通常不需要这样做.但它对某些组件非常有用,尤其是可重用的组件库. function FancyButto ...

  4. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  5. R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况

    R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况 目录

  6. mysql workbench kernelbase.dll_电脑出现kernelbase.dll错误的两种解决方法

    KernelBase.dll是Windows操作系统的重要文件,它为各种应用程序提供服务.如果电脑提示kernelbase.dll错误,这该怎么处理?大家可以用电脑自带的防火墙或者是第三方软件来进行故 ...

  7. 使用定制的NSDictionary的方法,对NSArray进行排序(附:数组排序两种常见方法)

    NSArray中存放的是NSDictionary,可以使用策略的方法对NSDictionary进行定制,增加比较的方法.然后调用NSArray的sortUsingSelector方法对数组进行排序,这 ...

  8. Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同:

    Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同: 1. 相同点: a) 都是使用异步提交的方式: b) 默认都是使用POST方式来提交数据 ...

  9. java代码二进制转为十六进制_Java 中二进制转换成十六进制的两种实现方法

    Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static Stri ...

最新文章

  1. 玩“剪刀石头布“的脑机!密歇根大学开发由大脑意识精密控制的假肢
  2. Hibernate-ORM:14.Hibernate中的命名查询
  3. java中的System.out.print()与System.out.println()的区别
  4. 1.3 Error和Exception的异同
  5. 【放置奇兵】算法 酒馆攻略
  6. 重构学习2-消除过长参数
  7. R语言tseries包
  8. Java判断两个Date是不是同一天
  9. ffmpeg在android上输出滑屏问题处理
  10. 中国医美市场趋势洞察报告
  11. 微软重写 Windows 10 激活规则
  12. 20个全屏响应式菜单效果荟萃
  13. 洛谷P2347 砝码称重 [2017年4月计划 动态规划01]
  14. 安卓UI相关开源项目库汇总
  15. 【对比Java学Kotlin】类型别名
  16. 鸿蒙系统可以微信吗,微信鸿蒙版下载-微信华为鸿蒙操作系统版 v7.0.21-91优手机网...
  17. 鹿晓亮:基于大数据云计算的语音识别深度平台
  18. 语音芯片c语言程序,语音芯片pm50 在430单片机上的C语言编程
  19. Unity云渲染开源框架UnityRenderStreaming使用说明
  20. 我研究我自己!苏炳添博士重磅论文:我怎么跑这么快?

热门文章

  1. lsblk 命令使用
  2. 使用强化学习和YOLOFlow实现基于自主无人机的目标搜索、跟踪
  3. 几种创建vue项目的方法
  4. ORA-00918:未明确定义列,在mybatis中
  5. automapper自动创建映射_Automapper 实现自动映射
  6. 无线蓝牙耳机性价比排行榜,便宜质量又好的学生蓝牙耳机推荐
  7. 微信小程序全屏轮播(仿北京环球)
  8. 年底量产交付 图森未来的生死一搏!
  9. flutter 处理前置摄像头拍出来的图片翻转问题,截取正方形图片问题
  10. 可编程控制器有几种编程语言以及它们的特点