NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:071298
用户头像

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

关注

评论

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

Redis 内存碎片清理

escray

redis 学习 极客时间 3月日更 Redis 核心技术与实战

Redis - AOF

insight

redis 3月日更

架构师知识笔记2

felix徐

周小川:数字货币将是下一代货币研究工作的核心

CECBC

数字货币

区块链如何助力中小企业解决融资难题

CECBC

区块链

MySQL-技术专题-知识点介绍

洛神灬殇

MySQL

10年后端开发程序员精心整理「C/C++ Linux服务器」 成长路线(附思维导图)

Linux服务器开发

Linux 后端 C/C++ Linux服务器开发 Linux后台开发

Wireshark数据包分析学习笔记Day24

穿过生命散发芬芳

Wireshark 数据包分析 3月日更

蚂蚁开源增强版 SpringBoot,都有高级特性?

Java小咖秀

开源 springboot 蚂蚁金服 SOFA

Go语言的初体验

Phoenix

Go 语言

Vue3源码 | 如何挂载组件元素?

梁龙先森

源码分析 大前端 Vue3

K8s各节点常用命令

happlyfox

学习 k8s 3月日更

阿里二面,面试官居然把 TCP 三次握手问的这么细致

鞋子特大号

面试 TCP 三次握手 四次挥手

区块链通证经济——资产流动性的变革

CECBC

资产流动性

管理者如何才能不亲力亲为?

石云升

项目管理 28天写作 职场经验 管理经验 3月日更

设计与思考,关于资源和生命周期(三)

程序员架构进阶

设计模式 架构设计 28天写作 3月日更 池化技术

Kubernetes Ingress 可视化编辑器

倪朋飞

Kubernetes 网络

极客时间·产品训练营·第八周作业

二大爷

极客大学产品经理训练营

Kubernetes 弃用 Docker 后如何切换到 Containerd

倪朋飞

Docker Kubernetes 微服务

使用雪花 id 或 uuid 作为 MySQL 主键,被老板怼了一顿!

Java小咖秀

MySQL 数据库 雪花算法 uuid 雪花id

mysql 检索分享上篇

new life

一篇文章让你彻彻底底理解 I/O 多路复用

Java 程序员 架构 面试 计算机

初识Golang之条件语句

Kylin

基础语法 3月日更 Go 语言

渣硕试水字节跳动,本以为简历都过不了,123+HR面直接拿到意向书

Java 编程 程序员 架构 面试

一束光的旅程

脑极体

软件工程笔记:学习方法

风翱

软件工程 笔记 3月日更

那些不得不知的缓存知识

Java 缓存 程序员 面试

火爆全网!2021年最新发布Java面试清单(九大技术点)

比伯

Java 程序员 架构 程序人生 架构师

mysql实现主主数据库(双机热备)

大奎

Go Modules 常见使用陷阱

Rayjun

go modules Go 语言

LeetCode链表专题01: 反转链表

小马哥

Java 链表 LeetCode 数据结构与算法 七日更

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