|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。只管良多人以为Aspect合用于像事件办理、缓存、耐久化、基于脚色的平安等方面的横向存眷点(cross-cuttingconcerns),RamnivasLaddad提到了其别的一种主要代价,就是作为一般项目使用注解的推进者。
注解,在JavaSE5.0中作为Java元数据工具(JSR175)被到场,供应了一种给程序元素增添元数据的办法。它们被用来设置容器、形貌耐久层设置、设置平安脚色,而且由几近全体最新的JSR尺度所界说。它们还包括了给Java代码增添自界说注解的机制,和经由过程反射供应编程会见元数据注解的办法。
面向方面编程(AOP)已被用来完成各类横向存眷点(cross-cuttingconcerns),局限从复杂的日记到初级的使用程序平安和事件办理。利用Aspects作为一种完成注解处置器的办法,则是对它们的一种分歧思索办法,分歧于传统架构师的“横向存眷点(crosscuttingconcerns)”视角的办法。Ramnivas谈到了使用Aspect和AOP注解,经由过程利用自界说注解给Java使用程序增添横向举动(cross-cuttingbehavior)。他议论了元数据和AOP互相给对方带来了甚么。元数据给选择毗连点(joinpoints)带来了附加信息,在那边Pointcuts利用注解来捕捉毗连点(joinpoints)。在特定用例情形下,它还匡助创立松耦合的aspect。而AOP则带来了一种消耗和供给注解的体系的办法。利用AOP供给元数据还给我们带来了整齐代码。利用AOP消耗元数据比起利用注解处置工具(APT)选项来有很多优点。
Ramnivas劝诫说利用元数据扩大Java言语多是双刃剑(既壮大又伤害)。另外一方面,注解使我们无需修正中心言语就能够给Java言语增添新的特征,这就使其成了一个开放的言语;在最好情形下,准绳性的扩大可以克制宿主言语的范围性。另外一方面,不尺度的、出格的、不联贯注解集大概招致代码不简单被了解。
从AOP取得年夜部分优点的最好理论之一就是利用元数据往为横向存眷点(cross-cuttingconcerns)捕捉毗连点(joinpoints)。记着,注解应当在毗连点处形貌甚么是“true”(前提)——在这些points处甚么不该该产生(举措)。他还倡议开辟者利用已有的注解(好比@Entity、@Table、@WebService等)。把没有元数据的pointcut看做是首选并依附于编程元素自己。并且,要制止特定完成的注解。懂得一同利用元数据和AOP的价值亲睦处是有匡助的。元数据能够以各类体例被消耗,懂得这些利用体例将匡助我们洞悉AOP和元数据的分离。Ramnivas在其AOP和元数据的文章(第1部分和第2部分)中给出了一些最好理论而且倡议开辟者不要太过寻求自界说注解。
在完成自界说注解过程当中次要的计划思索是,甚么(元数据,举动)、什么时候(编译时,运转时)、怎样(APT,运转时反射,AOP)在Java使用程序中使用注解。JohnHeintz比来做了一个关于给Java注解增添举动的电影,内里他对照了在Java使用中完成自界说注解的分歧计划手艺。John会商了字节码转换,其包含Aspect,将其作为三品种型注解处置选项之一。
- 发生器:这一注解处置选项包含读取源码并发生新的源码或修正已有源码。ATP和XDoclet属于这一范例。
- 字节码转换:这些注解处置器剖析带有注解的类文件并开释出修正过的类和新发生的类。它们还大概发生非类产品如XML设置文件。字节码转换的例子包含AspectJ、Spring、Hibernate、CGLib和BCEL。
- 运转时反射:这个选项利用反射API在运转时用程序反省对象。运转时反射的例子有如Java5+反射和CommonsAttributes类库。测试框架JUnit和TestNG利用运转时反射处置注解。
InfoQ就完成自界说注解过程当中Aspect所饰演的脚色采访了John。他说实践上它只是在完成自界说注解时应当被思索的一种均衡力气(工程上的折衷)。他还提到注解基于方面的完成供应了完成注解举动的年夜多半烦琐办法和一个会合的界说。可是开辟者必需分明地纪录非当地语义和关于构建或部署工具链(tool-chain)(编译或运转时编织)的影响。
检察英文原文:Aspects:AnEasyToolforAnnotationHandling?
来自:http://www.infoq.com/cn/news/2008/09/aspects-annotations
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。 |
|