写点什么

Aspects:一个处理注解的简单工具?

  • 2008-09-16
  • 本文字数:1603 字

    阅读完需:约 5 分钟

尽管很多人认为 Aspect 适用于像事务管理、缓存、持久化、基于角色的安全等方面的横向关注点(cross-cutting concerns), Ramnivas Laddad 提到了其另外一种重要价值,就是作为普通项目应用注解的推动者。

注解,在 Java SE 5.0 中作为 Java 元数据工具( JSR 175 )被加入,提供了一种给程序元素增加元数据的方法。它们被用来配置容器、描述持久层配置、设置安全角色,并且由几乎全部最新的 JSR 标准所定义。它们还包含了给 Java 代码增加自定义注解的机制,以及通过反射提供编程访问元数据注解的方法。

面向方面编程( AOP )已经被用来实现各种横向关注点(cross-cutting concerns),范围从简单的日志到高级的应用程序安全和事务管理。使用 Aspects 作为一种实现注解处理器的方法,则是对它们的一种不同思考方法,不同于传统架构师的“横向关注点(cross cutting concerns)”视角的方法。Ramnivas谈到了利用Aspect 和AOP 注解,通过使用自定义注解给Java 应用程序增加横向行为(cross-cutting behavior)。他谈论了元数据和AOP 相互给对方带来了什么。元数据给选择连接点(join points)带来了附加信息,在那里 Pointcuts 使用注解来捕获连接点(join points)。在特定用例情况下,它还帮助创建松耦合的 aspect。而 AOP 则带来了一种消费和供应注解的系统的方法。使用 AOP 供应元数据还给我们带来了整洁代码。使用 AOP 消费元数据比起使用注解处理工具( APT )选项来有不少好处。

Ramnivas 告诫说使用元数据扩展 Java 语言可能是双刃剑(既强大又危险)。另一方面,注解使我们无需修改核心语言就可以给 Java 语言增加新的特性,这就使其成为了一个开放的语言;在最好情况下,原则性的扩展能够克服宿主语言的局限性。另一方面,不标准的、特别的、不连贯注解集可能导致代码不容易被理解。

从 AOP 获得大部分好处的最佳实践之一就是使用元数据去为横向关注点(cross-cutting concerns)捕获连接点(join points)。记住,注解应该在连接点处描述什么是“true”(条件)——在这些 points 处什么不应该发生(动作)。他还建议开发者使用已有的注解(比如 @Entity @Table @WebService 等)。把没有元数据的 pointcut 看作是首选并依赖于编程元素本身。而且,要避免特定实现的注解。了解一起使用元数据和 AOP 的代价和好处是有帮助的。元数据可以以各种方式被消费,了解这些使用方式将帮助我们洞悉 AOP 和元数据的结合。Ramnivas 在其 AOP 和元数据的文章(第 1 部分第 2 部分)中给出了一些最佳实践并且建议开发者不要过分追求自定义注解。

在实现自定义注解过程中主要的设计考虑是,什么(元数据,行为)、何时(编译时,运行时)、如何(APT,运行时反射,AOP)在 Java 应用程序中应用注解。John Heintz 最近做了一个关于给 Java 注解增加行为的片子,里面他比较了在 Java 应用中实现自定义注解的不同设计技术。John 讨论了字节码转换,其包括 Aspect,将其作为三种类型注解处理选项之一。

  • 产生器:这一注解处理选项包括读取源码并产生新的源码或修改已有源码。ATP 和 XDoclet 属于这一类型。
  • 字节码转换:这些注解处理器解析带有注解的类文件并释放出修改过的类和新产生的类。它们还可能产生非类产物如 XML 配置文件。字节码转换的例子包括 AspectJ Spring Hibernate CGLib BCEL
  • 运行时反射:这个选项使用反射 API 在运行时用程序检查对象。运行时反射的例子有如 Java 5+ 反射和 Commons Attributes 类库。测试框架 JUnit TestNG 使用运行时反射处理注解。

InfoQ 就实现自定义注解过程中 Aspect 所扮演的角色采访了 John。他说实际上它只是在实现自定义注解时应该被考虑的一种平衡力量(工程上的折中)。他还提到注解基于方面的实现提供了实现注解行为的大多数简便方法和一个集中的定义。但是开发者必须清楚地记录非本地语义和对于构建或部署工具链(tool-chain)(编译或运行时编织)的影响。

查看英文原文: Aspects: An Easy Tool for Annotation Handling?

2008-09-16 13:071681
用户头像

发布了 150 篇内容, 共 50.1 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

镜像是什么意思?分类有哪些?

行云管家

网络安全 镜像 堡垒机 云厂商

字节跳动Android面试:2021Android大厂面试知识分享

欢喜学安卓

android 程序员 面试 移动开发

拍乐云创始人赵加雨:沉浸式音视频加持数智化未来世界

拍乐云Pano

一周信创舆情观察(7.26~8.1)

统小信uos

FastApi-06-请求体-3

Python研究所

FastApi 8月日更

现有市值管理机器人|交Y机器人系统源码搭建

Geek_23f0c3

做市机器人 去中心化市值管理机器人

为什么拥抱能源的数字未来意味着在云上全力以赴

九河云安全

Linux内核分析学习路线总结(内核人员必看)

Linux服务器开发

操作系统 Linux内核 内核源码 内核开发 驱动开发

云计算以及云计算周边词概念简单介绍-行云管家

行云管家

云计算 服务器 云服务

一个算法“拿下”两个榜单!爱奇艺ICCV 2021论文提出人手三维重建新方法

爱奇艺技术产品团队

vr 论文 ICCV2021 高精度三维重建

Python RPC 不会?不妨看看这篇文章

星安果

Python RPC RPC架构

5 分钟,快速入门 Python JWT 接口认证

星安果

Python JWT

从关门“振动”说起,在这部剧本杀综艺里,爱奇艺隐藏了多少技术“小心机”

爱奇艺技术产品团队

综艺节目 互动视频技术 爱奇艺

中台的前世今生

涛哥 数字产品和业务架构

企业架构 中台架构 中台的由来

人在年轻的时候,最核心的能力是什么?

非著名程序员

认知提升 个人提升 提升自我 8月日更

101道经典JavaScript面试题总结(附答案,建议收藏)

前端依依

面试 大前端 JavaScrip

最全总结 | 聊聊 Python 数据处理全家桶(存储过程篇)

星安果

Python 数据库

强推!华为内部都在用的783页大数据处理系统:Hadoop源代码pdf

Java 编程 架构 面试 架构师

云原生时代,腾讯如何做好容器安全体系建设?

腾讯安全云鼎实验室

腾讯云 容器

第一次凡尔赛,字节跳动3面+腾讯6面一次过,谈谈我的大厂面经

Java~~~

Java 面试 微服务 多线程 架构师

摘下手机赛场的夏季“金牌”,荣耀的“飞人之路”

脑极体

贝壳找房基于StarRocks构建全新统一的极速OLAP平台实践

StarRocks

数据库 数据分析 OLAP StarRocks

PostgreSQL正强势回归!

数据库 大数据 时序数据库 tsdb 数据智能

【共识专栏】Quorum机制与PBFT

趣链科技

区块链 共识机制 PBFT 共识算法

开放搜索电商行业模版驱动业务增长实践

阿里云大数据AI技术

维护数据隐私和增强竞争优势的秘密

九河云安全

Github首次开放,一天遭狂转 50w 次!阿里内部不外传的 100 万字 Java 面试手册!

Java 程序员 架构 面试 计算机

资深大牛带你了解源码!最新Android面试题整理

欢喜学安卓

android 程序员 面试 移动开发

阿里顶级大佬整理出十六个专题的Java面试指南,金九银十不用愁!

Java 编程 架构 面试 架构师

写作7堂课——【1.框架式写作】

LeifChen

框架 结构化思维 写作技巧 8月日更

使用PyTorch构建神经网络模型进行手写识别

Shirakawa

神经网络 机器学习 深度学习 PyTorch 手写识别

Aspects:一个处理注解的简单工具?_Java_Srini Penchikala_InfoQ精选文章