近来研究AOP,在了解其实现如AspectJ和Spring等之余,也多了些思索.
早晨一觉醒来,顿觉精神气爽,再看时间还早,也就躺床上闭目养神.而思维此时却象脱缰的野马,纵横驰骋,不知不觉就想到我所从事和钟爱的软件上来.忽发奇想:其实软件的最终目标就是模拟真实世界,甚至进一步说就是创造世界(看过Matrix的朋友应该能理解).所以OOP,AOP或今后将出现的什么新的软件思想也都只是这一进程中的小浪花而已,而他们的出现及发展,也就是为了更好的模拟我们的生活.
OOP的出现之所以被称为一个很大的突破,正因为它很大程度上符合世界的构成.java有 “Everything is object”之说,正是有了Object这个有利的武器,使得我们在用OOP表现世界的某些方面时能够得心应手.但我们世界除了Object还有很多其它的东西,比如道德,法律,规范,规律……而AOP的出现正是模拟这些方面.
以我们最熟悉的对象“人”作为考察的对象.人做为对象由多个对象组成,如手,眼……我们作为世界的个体,首先守很多规律的制约.如万有引力定律,牛顿三大定律……这些规律是无处不在的,任何人都无法去避免或改变.还有法律,这是人为拟定的对某些个体具有约束性的规范,如果相应个体违法,则会受到法律的制裁.注意这里是“某些个体”,各国的法律只在本国范围内有效,不同的法律又有不同的受众.这样对个体而言,你就受到某些法律的约束.你知道法律可以决定去遵守或违背它,而你不知道,法律也是客观存在,你不去违背,可能根本感受不到它,而在你即使毫不知情的情况下违背时,它也会显示它的威力.至于如道德或规范等,其强制性不如法律,但就与个体的相互关系而言其实与法律完全一样.
如果从程序的角度来实现上面的相互关系.仅用OOP的思想,就会非常的困难.先说这些定律,他们无时不在,无处不在,只是看什么定律对你当前的行为有影响.如你要上上网,听听歌,可能感受不到万有引力定律和牛顿定律的存在,而你要从12层的楼往下跳试试,万有引力定律和牛顿定律直接决定了你的生死.用程序实现上上网,听听歌或跳跳楼都可做到.你听歌可以计算对耳膜的震动量,音乐对你神经的刺激量;上网可以计算你颈部僵硬时间的长短,计算你网上泡mm的兴奋度;跳楼则根据万有引力定律计算你坠地时的速度和对身体触地部位的冲量.在这些行为中,人是同一个人,也就是同一个对象,只是行为不同,也就是方法不同.那执行不同的方法时要遵循不同的定律.如果用OO的思想我们把定律抽象为对象,则定律起作用就是定律对象的方法被调用.同一个”人”对象,在调用不同的方法时,要明确什么定律起主要作用,就必须要把相应定律接口申明到自己方法体中去.这样就形成了耦合!当然使用Design Pattern能将这种耦合变成松耦合,如使用Observer模式,但即使这样也会有很多的问题:如果同时多个定律起作用,或定律起作用有先后顺序,或这些定律没法形成一个统一的父类接口……还有observer模式其实也是主动的模式,它依赖于对象要主动notify这些observer.
更有意思的是,如果一只鸡或一只鸭从楼上掉下去,它也要遵守万有引力定律和牛顿定律,而且计算方式与人完全一样.如果用OOP的思想,一是使用继承,定义一个父类,由它实现高处落下时的逻辑,这样子类就可以自动获得这些逻辑,但这样势必将因为影响行为的定律的复杂性,而带来类层次的复杂性;二是使用代理,东西由高处落下就交给一个delegate对象去处理,而这样需要多少种delegate对象,每用一个delegate对象,就意味着当前对象耦合了一个delegate对象,结果对象的耦合性越来越强.
那么换个角度想,如果真有一个上帝,它监控着所有的对象,只要某一个对象从高处落下,它就把万有引力定律和牛顿定律用到这个对象身上,而不管这个对象是否知道这两个定律.这样对象与这两个定律完全解耦合,它只管做自己的事,比如一个人从窗台跳下去, 万有引力定律和牛顿定律也起作用,但他没有什么损伤,接着就骑辆车上街去了……上街是这个人的主要目的,跳窗台也许是为图一时方便,下次他也许就不跳了.但只要他跳了,就得由上帝用万有引力定律和牛顿定律计算一下,如果窗台很高,计算结果或许就是他骨折了,只能躺医院去.这个上帝就是自然规律.我们可能感觉不到它的存在,但它确实在那里,只要条件被触发,它就会起作用,不依赖于任何个体.
AOP正是这个上帝在程序世界的体现.一个Aspect就是一条定律或规范及其执行策略.对普适定律而言,他对所有系统中的对象起作用.而一些法律,比如未成年人法就只对未成年人起作用,一些规定比如车辆经过收费站要收费,却对公车无效.一个Aspect的pointcut就类似这些定律或法律或规定起作用的条件,它能确定对象的范围,对象的行为,并将一些特权阶级,特权行为剔除出去.而advice就是他们的执行了.
对AOP的具体语法,我不想涉及,大家很容易找到资料.我希望的是能有很多的人谈谈自己对AOP的认识,我的观点也许也很片面,希望通过讨论更加的完善.<!----><o:p></o:p>
分享到:
相关推荐
20. 民用航空器飞越城市上空:在下列情况下民用航空器可以飞越城市上空,包括指定的航路必需飞越城市上空时、能见地标的目视飞行时、夜间飞行时等。 21. 航空器灯光判断:如观察到其他飞机的灯光是右红左绿时,应将...
支持面向方面的编程 (AOP) 的语言更常使用用于一组点的函数 - 切入点。 这些点的功能由程序代码决定,它被礼貌地称为 Advice (AspectJ)。 因此,方面描述了一组特定系统组件的横切关注点。 组件本身仅包括它们应该...
于是经过一番研究手动实现一个类似Spring的IOC和AOP功能的演示,本demo成功实现了容器的依赖注入和切面的功能,aop使用CGLIB实现。 说明 首先代码的测试运行demo见 应用程序 public static void main(String[] args...
申请,并认证(未认证不能发布,认证需要300元,目前只支持企业认证)详细见官网说明。 https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN 申请后登陆 https://mp.weixin.qq.com/ 二....
建议.js 适用于 Node.js 和浏览器的简单 AOP 库。 function base ( ) { }// compose a new function which calls a function after base returnsvar fn = advice . after ( base , function ( ) { console . log ( '...
在Java中,AspectJ是AOP最广泛使用的库之一,它提供了一种强大的语言级支持,可以定义切点、通知类型以及它们之间的关系。 5. **使用场景** - 在实际项目中,AspectJ常用于以下场景: - 日志记录:在方法调用前后...
1. **Spring框架**:Spring是Java开发的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心功能,简化了Java应用的开发。在SSM中,Spring负责管理各个组件,如数据库连接池、事务管理以及服务层对象等。 ...
AOP中,所需要的jar包,cglib-nodep-3.2.5.jar aspectjrt-1.6.8_3-20130313.151215-2.jar aspectjweaver-1.9.5.jar具体的应用常见,见我的博客
权限管理的设计与实现,从如何见表到如何拦截,拦截主要使用java的Filter和Aop
1.标题所提及技术的整合,Spring包括mvc、aop、ioc等。个人属于强迫症类型,技术水平怎么样再说,代码必须好看 2.Hibernate几个级别缓存对比。见DaoImpl类 3.Ehcache方法缓存及页面缓存。见applicationContext-cache...
视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 1、课程简介 Spring框架是一系列应用框架的核心,也可以说是整合其他应用框架的基座。同时还是SpringBoot的基础。在当下的市场开发环境中,...
1. **Spring框架**:Spring是一个开源的应用框架,它提供了依赖注入(DI)和面向切面编程(AOP)的功能,使得开发者可以更加便捷地管理对象之间的依赖关系,并实现了代码的解耦。在见福便利店信息管理系统中,Spring...
1.标题所提及技术的整合,Spring包括mvc、aop、ioc等。个人属于强迫症类型,技术水平怎么样再说,代码必须好看 2.Hibernate几个级别缓存对比。见DaoImpl类 3.Ehcache方法缓存及页面缓存。见applicationContext-cache...
视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 讲解方式: 以基础入门为主,使用PPT进行讲解,每个技术都配有相应的Demo进行知识落地理解 课程亮点: 适合对SSM没有使用过的同学,讲解通俗...
1. **Spring框架**:Spring是Java企业级应用开发的核心框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性,简化了Java应用的开发和测试。在本系统中,Spring负责管理各个组件之间的依赖关系,实现业务逻辑...
1. **Spring框架**:Spring是Java领域中一个非常重要的轻量级框架,它通过依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)简化了Java应用的开发。在本系统中,Spring负责...
Spring是Java企业级应用开发的核心框架,它提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等特性,使得开发者可以更方便地管理对象和处理事务。 **2. SpringMVC**...
局域网监视工具,可以在一台机器上监视整个局域网各主机的活动,包括程序运行,网络通讯,...印象中用到了该公司的一套aop库 屏幕截图见: http://hi.baidu.com/wangfeiyuer/blog/item/6684e919dd663b0135fa4191.html
首先,Spring的事务处理是其核心功能之一。在处理自我调用的事务时,需要注意由于事务的传播属性导致的问题,以及使用代理模式可能带来的风险。作者提到了如何解决这些问题并分析了不同实现方式的优缺点。 AOP...