spring中aop技术基础内容摘要:

这些具有公共逻辑的,与其他模块的核心逻辑纠缠在一起的行为称为 “横切关注点( Crosscutting Concern) ”,因为它跨越了给定编程模型中的典型职责界限。 横切关注点 一个关注点( concern)就是一个特定的目的,一块我们感兴趣的区域,一 段我们需要的逻辑行为。 从技术的角度来说,一个典型的软件系统包含一些核心的关注点和系统级的关注点。 举个例子来说,一个信用卡处理系统的核心关注点是借贷 /存入处理,而系统级的关注点则是日志、事务完整性、授权、安全及性能问题等,许多关注点 ——即横切关注点( crosscutting concerns) ——会在多个模块中出现。 如果使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进。 AOP 能够比上述方法更好地分离系统关注点,从而提供模块化的横切关注点。 例如一个复杂的系统,它由许多关注点 组合实现,如业务逻辑、性能,数据存储、日志和调度信息、授权、安全、线程、错误检查等,还有开发过程中的关注点,如易懂、易维护、易追查、易扩展等,图 演示了由不同模块实现的一批关注点组成一个系统。 图 把模块作为一批关注点来实现 通过对系统需求和实现的识别,我们可以将模块中的这些关注点分为:核心 关注点和横切关注点。 对于核心关注点而言,通常来说,实现这些关注点的模块是相互独立的,他们分别完成了系统需要的商业逻辑,这些逻辑与具体的业务需求有关。 而对于日志、安全、持久化等关注点而言,他们却是商业逻辑模块所共同需要的,这些逻辑分布于核心关注点的各处。 在 AOP 中,诸如这些模块,都称为横切关注点。 应用 AOP 的横切技术,关键就是要实现对关注点的识别。 如果将整个模块比喻为一个圆柱体,那么关注点识别过程可以用三棱镜法则来形容,穿越三棱镜的光束(指需求),照射到圆柱体各处,获得不同颜色的光束,最后识别出不同的关注点。 如图 所示: 图 关注点识别:三棱镜法则 上图识别出来的关注点中, Business Logic 属于核心关注点,它会调用到 Security, Logging,Persistence等横切关注点。 public class BusinessLogic { public void SomeOperation() { //验证安全性; Securtity关注点; //执行前记录日志; Logging关注点; DoSomething()。 //保存逻辑运算后的数据; Persistence关注点; //执行结束记录日志; Logging关注点; } } AOP的目的,就是要将诸如 Logging之类的横切关注点从 BusinessLogic类中分离出来。 利用 AOP技术, 可以对相关的横切关注点封装,形成单独的 “aspect”。 这就保证了横切关注点的复用。 由于 BusinessLogic 类中不再包含横切关注点的逻辑代码,为达到调用横切关注点的目的,可以利用横切技术,截取 BusinessLogic 类中相关方法的消息,例如 SomeOperation()方法,然后将这些“aspect”织入到该方法中。 例如图 : 图 将横切关注点织入到核心关注点中 通过利用 AOP 技术,改变了整个系统的设计方式。 在分析系统需求之初,利用 AOP 的思想,分离出核心关注点和横切关注点。 在实现了诸如日志、事务管理、权限控制等横切关注点的通用逻辑后,开发人员就可以专注于核心关注点,将精力投入到解决企业的商业逻辑上来。 同时,这些封装好了的横切关注点提供的功能,可以最大限度地复用于商业逻辑的各个部分,既不需要开发人员作特殊的编码,也不会因为修改横切关注点的功能而影响具体的业务功能。 为了建立松散耦合的、 可扩展的企业系统, AOP 应用到的横切技术,通常分为两种类型:动态横切和静态横切。 动态横切 动态横切是通过切入点和连接点在一个方面中创建行为的过程,连接点可以在执行时横向地应用于现有对象。 动态横切通常用于帮助向对象层次中的各种方法添加日志记录或身份认证。 在很多应用场景中,动态横切技术基本上代表了 AOP。 动态横切技术的核心主要包括 join point(连接点), point cut(切入点), advice(通知)和 aspect(方面)。 在前面,我已经概要地介绍了这些术语分别代表的含义。 接下来, 我将以一个具体的实例来进一步阐述它们在 AOP 动态横切中实现的意义。 考虑一个电子商务系统,需要对订单进行添加、删除等管理操作。 毫无疑问,在实际的应用场景中,这些行为应与权限管理结合,只有获得授权的用户方能够实施这些行为。 采用传统的设计方法,其伪代码如下: public class OrderManager { private ArrayList m_Orders。 public OrderManager() { m_Orders = new ArrayList()。 } public void AddOrder(Order order) {。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。