Posted on 2009-08-08 22:01
kangaroo 阅读(271)
评论(0) 编辑 收藏
用于实现AOP技术的主要策略,按照功能由弱到强排列:
-J2SE动态代理
-动态字节码生成
-java代码生成
-使用定制的类加载期
-语言扩展
1.J2SE动态代理
动态代理是一种强大的语言结构,它使我们可以为一个或多个接口“凭空”地创建实现对象,而不需要预先有一个实现类。
动态代理最大的好处在于:这是一种标准的Java语言特性。除了AOP框架之外不需要第三方库,也不回受到应用程序的任何影响。
动态代理的最大局限性在于:它只能针对接口进行代理,不能针对类。一般情况下,这种限制不是坏事,因为AOP主要针对业务对象,而业务对象通常是放在业务接口之后。
动态代理在java1.4和更高的版本性能表现地相对好,不过,一旦使用动态代理的实习策略,便不可避免地招致反射调用的开销。
2.动态字节码生成
为了针对Java类提供代理,我们需要动态代理之外的工具,就是动态字节码生成。应该庆幸,Java的反射和类装载机制都非常开发,因此实现动态字节码生成库并不复杂。
在这方面,最流行的工具就是CGLIB(Code Generation Library)。在spring中,如果需要针对类(而不是接口)提供代理,就会用到CGLIB。它可以针对制定的类动态生成一个子类,并覆盖其中的方法,从而实现方法的拦截。CGLIB风格的字节码增强并应用在Hibernate2.X版本中,并被证明是一种成熟的技术。Hibernate的成功表明,在应用服务器环境下CGLIB没有给最终用户带来任何困扰。
不过CGLIB有个小问题就是,因为它是通过生成类的子类来实现代理的,所以无法为final方法提供代理。
3.java代码生成
逐渐退出流行。
4.使用定制的类加载器
5.语言扩展
AspectJ就对java进行了扩展,将AOP概念作为一等公民来对待。