基于Aspect的Declare Annotation,才能做到彻底的无侵入。AO复兴的标志?
加入不加入语言支持,这不是关键。关键是,是否方便调试,是否方便TDD(当然,首先必须满足必要的功能,否则就不用说了)。照这个标准,AspectJ是个糟糕的方向。AspectJ增强后的代码,不但debugger跟踪不到,而且异常堆栈的行号都和原来的源代码对不上(那是当然了),调试起来会头大如斗。AspectJ让“编辑-构建-发布”周期变长了,修改源码之后必须先做预编译,才能执行单元测试。
更加糟糕的是,用AspectJ你不能动态决定是否加载aspect。想想吧,小陶,当一个class被预编译增强之后,你又打算不给它加载aspect了,该怎么办?恐怕你必须重新预编译整个系统。那么,如果这个class在某些时候需要aspect、某些时候不需要呢?“是否需要AOP能力”、“需要哪些aspect”应该、必须是在配置文件中声明的,不然你甚至不能独立地测试一个component。所以现在基于动态代理的AOP才是主流。
本文探讨了基于Aspect的DeclareAnnotation实现AOP的方式,并对比了动态代理AOP的优势。指出AspectJ虽然提供了强大的功能,但在调试和TDD方面存在不足,特别是对于编辑-构建-发布周期的影响及灵活性的限制。
27万+

被折叠的 条评论
为什么被折叠?



