写点什么

Ramnivas Laddad 谈 AOP 选型

2009 年 1 月 11 日

Spring AOP/AspectJ 搭配能提供多种选择,比如 AOP 系统的选择(基于字节码的 AOP 或基于代理的 AOP)、语法的选择(传统的 AspectJ 、@AspectJ 或 XML 语法),还有织入方式的选择(构建时织入器或加载时织入器);在企业应用中使用 AOP 时,清楚地理解这些选择对实施的效果来说是非常重要的。

Ramnivas Laddad 说,只有一种 AOP 是不能适用于所有应用的,选择正确的组合有助于开发人员成功使用 AOP。他在近期的 SpringOne Americas大会上做了演讲,谈论了各种AOP 设计、Spring AOP 框架提供的实现选择,还有Web 应用中使用AOP 的最佳实践。

Ramnivas 讨论了 AspectJ 织入和基于代理的 Spring AOP 方法的优势与不足。在 Spring AOP 和 AspectJ 之间进行选择取决于设计和环境因素。在下述情况下使用 Spring AOP:

  • 单纯的方法拦截就足够了。
  • 全套的 AOP 功能显得太多。
  • 不想使用特殊的编译器,比如 AspectJ 编译器( ajc )。
  • 不需要横切领域对象。
  • 预先提供的方面已经能满足需求。

其它情况使用 AspectJ AOP。他列举了一些 AspectJ(细粒度跟踪和监控,领域对象,细粒度安全)和代理 AOP(事务管理,JMX 监控,远程访问和安全)的例子应用。在演讲过程中,Ramnivas 用代码示例展示了传统AspectJ @AspectJ 语法这两种选择之间的差异。

方面织入选型包含编译时织入和加载时织入( LTW )。使用 LTW 时,你可以使用允许方面织入的 Spring 驱动 LTW,该 LTW 不用修改任何容器启动脚本(没有 -javaagent 参数),也无需利用 Spring 使用配置选项的 JPA 代理。这两种织入选择之间的比较如下:

构建时织入(编译 / 二进制):

  • 织入在构建时花费时间,但在加载时是全速的。
  • 需要修改构建系统。
  • 无须任何部署修改。
  • 最好的 IDE 支持——Eclipse AspectJ Development Tools( AJDT )。

加载时织入:

  • 加载时速度和内存占用会受到影响。
  • 不用改变构建系统,但为了织入方面,需要修改部署。
  • 没有 IDE 工具的支持。

AOP 设计选择包括利用连接点签名(join point signatures)的切入点实现和使用通配符选择大范围的连接点。元数据(注解)也可用来捕获连接点,该方法有如下优势和不足:

  • 优势:
    用注解捕获应用中特定的横切关注点是一种很简单的方式。注解有助于把方面和类之间的协作只限定于注解。
  • 不足:
    必须需要类的协作。另外,过度利用注解可能会掩盖 AOP 的遗忘性(obliviousness)。

AOP 实现使用元数据的最佳实践有:

  • 注解是表达程序元素固有特性的最佳选择。
  • 注解应该描述清楚连接点上什么是符合要求的,而不是在这些点上应该发生什么。
  • 避免特定实现的注解。
  • 注解应该描述被注解元素的状态。举例来说,为了捕获一个只读场景,用 @ReadOnly 作为注解名,而不要用 @TakeReadLock。要标记一个需要具有事务性的方法,使用 @Transactional,而不要用 @JTATransactional。
  • 不要用注解创建宏。
  • 使用已有的注解,诸如 JPA( @Entity @Table )、JAX-WS( @WebService @WebMethod )、Spring( @Component @Service @Autowired @ManagedResource )。

查看英文原文: Ramnivas Laddad on Making AOP Choices With AspectJ and Spring AOP

2009 年 1 月 11 日 18:15538
用户头像

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

关注

评论

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

11 组关系带你看清 JVM 全貌

田维常

JVM

智慧警务大数据系统开发,智慧公安情报研判平台搭建

WX13823153201

智慧警务大数据系统开发

智慧公安动态大数据平台开发情报分析中心系统开发

135深圳3055源中瑞8032

厉害,GitHub上标星90.7K「Java学习+面试指南」学会互联网大厂随便选

Java成神之路

Java 程序员 架构 面试 编程语言

围观|第一代云原生企业米哈游如何让想象发生?

阿里巴巴云原生

阿里云 最佳实践 运维 云原生 游戏开发

阿里 10 年:一个普通技术人的成长之路

阿里巴巴云原生

阿里云 云原生 技术人 自我思考 职场成长

Linux 如何实现定时调度任务

Near

Linux Timer 定时调度

4. 上新了Spring,全新一代类型转换机制

YourBatman

Spring Framework 类型转换 Converter

数据结构与算法经典问题解析-Java语言描述

田维常

数据结构

为了面试大厂,精选2020年大厂高频Java面试真题集锦(含答案)

Java成神之路

Java 程序员 架构 面试 编程语言

全面覆盖:Java面试266题—算法+缓存+JVM搜索+分布式+数据库等

Java成神之路

Java 程序员 架构 面试 编程语言

第九周总结

小兵

快手基于 Apache Flink 的优化实践

Apache Flink

flink

Synchronized用法原理和锁优化升级过程(面试)

叫练

synchronized 轻量级锁 偏向锁 多线程与高并发 同步

详解Spring5+SpringMVC5+MyBatis3.X,同时整合Redis缓存+ActiveMQ+项目等

Java架构追梦

Java spring 架构 mybatis springmvc

公安大数据:警务大数据分析系统解决方案

t13823115967

智慧公安

Java并发编程:AQS的原子性如何保证

码农架构

Java java 并发

ETHERZ流动性挖矿系统软件APP开发

开發I852946OIIO

系统开发

vivo 微服务 API 网关架构实践

vivo互联网技术

微服务 微服务网关 API网关 Zuul2

MySQL修改账号密码方法大全

Simon

MySQL 七日更

为什么你成为不了团队核心成员

数据社

团队 七日更

业务重要?还是技术重要?

数据社

思考 团队 七日更

UBI波场挖矿系统软件APP开发

开發I852946OIIO

系统开发

看了这份阿里Redis笔记,以后出去redis的问题你随便问

Java成神之路

Java 程序员 架构 面试 编程语言

奋斗30天,苦心啃透java高级工程师面试1000题,涨薪10K很难吗?

Java成神之路

Java 程序员 架构 面试 编程语言

Code Shared & Review(20201214-20201220)

刘璐

全面到哭!阿里内部疯传Netty实战文档程序员必须人手一份

比伯

Java 编程 架构 程序人生 编程语言

优化PostgreSQL Autovacuum

PostgreSQLChina

数据库 postgresql 开源 优化

蚂蚁集团下架互联网存款产品:互联网金融是天使还是魔鬼

石头IT视角

测开之函数进阶· 第1篇《递归函数》

清菡

测试开发

安防小区管控系统建设,智慧社区智能化集成方案

t13823115967

智慧平安社区平台建设

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

Ramnivas Laddad谈AOP选型-InfoQ