读《J2EE Development without EJB》 笔记四

Declarative Middleware Using AOP Concepts -- 基于AOP概念的声明性中间件

    AOP的全称是面向方面编程(Aspect-Oriented Programming),这是Gregor Kiczales于1996年在PARC提出的一个术语。AOP是一种与OOP截然不同的看待应用程序结构的方式,按照AOP的观念,系统被分解为方面(aspect)或者关注点(concern),而不是对象。
    曾经有一位同行把他理解为面向切面编程,更具有几何学的味道,也很容易理解。

    AOP的目标是将横切性(crosscutting)的问题以一种更加通用的方式模块化,从而提升程序的模块化程度。

    AOP应该看作是OOP的补充,而不是竞争对手、替代者,AOP不仅可以减少重复代码的麻烦,而且为系统的领域模型的设计上带来一种更加完善的理念。

    几个关于AOP术语定义:
1、关注点(concern):一个关注点可以是一个特定的问题、概念、或是应用程序的兴趣区间--总而言之,应用程序必须达到的一个目标。
2、横切关注点(crosscutting concern):如果一个关注点的实现代码散落在很多个类或方法之中,就称之为“横切关注点”。
3、方面(aspect):一个方面是对一个横切关注点的模块化,它将那些原本散落在各处的、用于实现这个关注点的代码规整到一处。
4、连接点(join point):程序执行过程中的一点,例如:
    方法调用(method invocation):对方法(可能包括构造子)的调用。
    字段访问(field access):读或写实例变量。
    异常抛出(throws):特定的异常被抛出。
5、增强(advice):在特定连接点执行的动作。--很多AOP框架都以拦截器(interceptor)的形式来表现增强---所谓拦截器是这样的一个对象:当连接点被调用到时,它会收到一个回调信息。
6、切入点(pointcut):一组连接点的总称,用于指定某个增强应该在何时被调用。切入点常用正则表达式或别的通配符语法来描述。
7、引介(introduction):为一个现有的Java类或接口添加方法或字段。
8、混入继承(mixin inheritance):一个“混入类”封装了一组功能,这组功能可以被“混入”到现有的类当中,并且无须求助于传统的继承手段。
9、织入(weaving):将方面整合到完整的执行流程(或完整的类,此时被植入的便是引介)中。
10、前增强(before,pre):在连接点调用之前,首先调用增强。
11、后增强(after,post):在连接点调用之后,再调用增强。
12、环绕增强(around):这类增强可以完全控制执行流程。
13、拦截器(interceptor):一种AOP的实现策略。
14、AOP代理(AOP proxy):即被增强(advice)的对象引用---也就是说,AOP增强将在其上执行的这样一个对象引用。
15、目标对象(target object)]
16、增强器(advisor)Spring引入的概念,由两个部分组成:一个增强,以及一个用于说明“在何处进行增强”的切入点。增强器完整地模块化了一个方面。这样,切入点和增强也可以各自独立地复用。

    Decorator模式,需要针对每个目标类单独编写一个定制的装饰器。
    Observer模式,必须插入一些与业务逻辑无关的代码。
    Chain of Responsibility(责任链)模式,允许将一个请求在一条对象链上传播,直到其中的某一个对象负责处理请求为止。

    Servlet2.3规范引入的servlet拦截器会在处理web请求的前后被调用。

    AOP技术的主要策略:J2SE动态代理、动态字节码生成、Java代码生成、使用定制的类加载器、语言扩展。

    动态代理(dynamic proxies),是一种强大的语言结构。
    动态代理最大的好处在于:这是一种标准的Java语言特性。除了AOP框架之外不需要第三方库,也不会受到应用服务器的任何影响。
    动态代理的最大局限性在于:它只能针对接口进行代理,不能针对类。不是坏事--因为AOP主要针对业务对象,而业务对象通常应该是放在业务接口之后的。

    动态字节码生成(dynamic byte code generation),为了针对Java类提供代理,我们需要动态代理之外的工具,那就是动态字节码生成。Java的反射和类装载机制都非常开放。--最流行的工具CGLIB(Code Generation Library)。CGLIB是通过继承来实现代理的,所以无法为final方法提供代理。

    Java代码生成,由于前两者的出现,其正在退出流行。

    使用定制的类加载器--?

    语言扩展

    AOP实现:AspectJ、AspectWerkz、JBoss4、Spring
    AspectJ可以对任何方法调用、字段访问、对象构造、异常抛出进行增强。
    AspectWerkz和AspectJ已合并。
    JBoss4的AOP框架和JBoss应用服务器的邦定,损害了J2EE“可移植性”的优点。

    AOP在J2EE应用中的价值大多体现在方法拦截上--过几年,还会是这样么?

    通常AOP用于业务对象提供增强,在这种情况下,拦截的性能开销根本不成问题。关键:什么粒度夏使用AOP。
    一次涉及凡是的方法调用需要耗费的时间是毫秒级的--在服务器环境下通常在几毫秒至十几毫秒的范围。从比较来看,一次数据库只读访问的时间开销通常是数十毫秒,通过浏览器访问web页面的网络延迟则是百毫秒级的。也就是说,对于一个由远程客户端发起、需要涉及一到两次数据库访问的业务操作来说,“通过反射调用业务方法”的时间开销完全可以忽略不计。

    AOP最有价值的用途就是在业务方法的粒度上提供通用的企业级服务,譬如声明性事物管理和声明性安全检查等。

    AOP和IoC之间有特别紧密地合作关系。

    Spring中的AOP实践
    1、使用ProxyFactoryBean:创建AOP代理的基本途径。
    2、便利的FactoryBean:例如TransactionProxyFactoryBean(声明性的事物管理)。
    3、自动代理

    AOP使我们开始在领域模型的层面上分析和识别横切关注点,就像分析和识别对象一样。

你可能感兴趣的:(读《J2EE Development without EJB》 笔记四)