zoukankan      html  css  js  c++  java
  • Spring AOP 问与答

    AOP的实现有哪些

    AOP常见的实现有:

    • Spring AOP
    • Aspectj
    • Guice AOP
    • Jboss AOP

    AOP Alliance 是什么, 为什么Spring AOP, G UI CE AOP等需要aopalliance.jar?

    AOP Alliance定义了AOP中的基础概念,但它并不是一种AOP的实现,它的目标为各种AOP实现提供统一的接口.Spring AOP, GUICE等都采用了AOP Alliance中定义的接口.

    Spring AOP 和 Aspectj的区别?

    • Spring AOP采用动态代理的方式,在运行期生成代理类来实现AOP,不修改原类的实现.
    • Aspectj 使用 编译 期字节码织入(weave)的方式,在编译的时候,直接修改类的字节码,把所定义的切面 代码 逻辑插入到目标类中。
    • Spring AOP可以对其它模块正常编译出的代码起作用,Aspectj 需要对其它模块使用acj重新编译
    • Spring AOP对于直接调用类内部的其它方法无效(需要获取对应的代理类来吊用),无法对定义为 final 的类生效(因为无法撑撑代理类,导致运行时异常)。Aspectj没有这些限制
    • Spring AOP使用 XML 配置 文件的方式定义切入点(CutPoint),Aspectj使用注解方式

    • 注: Aspectj 除了编译期静态织入的方式之外,也支持加载时动态织入修改类的字节码。

    Spring AOP的代理类如何实现的?

    Spring AOP使用JDK Proxy或者cg lib 实现代理类生成。对于有实现接口的类使用JDK Proxy,对于无接口的则是用cglib.通过

    <aop:aspectj-autoproxy proxy-target-class="true"/>

    指定proxy-target-class为true可强制使用cglib.

    JDK Proxy 和 cglib什么区别?

    JDK Proxy只适用于类实现了接口的情况,关系图:

    Interface ----------> OriginClass           |---------> ProxyClass

    生成的代理类实现了原类的接口,但和原类没有继承关系.

    cglib则是生成原来的子类,对于没有实现接口的情况也适用:

    OriginClass --------> ProxyClass

    cglib采用字节码生成的方式来在代理类中调用原类方法, JDK Proxy 则是使用反射调用,由于反射存在额外security check 的开销一集目前jvm jit对反射的内联支持不够好,JDK Proxy在性能上弱于cglib

    spring -aspects 又是什么鬼

    因为Spring AOP XML配置文件定义的方式太繁琐遭到吐槽,所以spring从Aspectj中吸收了其注解定义的方式。然而其实现依然是动态代理的方式,与aspectj 字节码织入的方式不同。

    既然如此,那为什么spring-aspects 还需要aspectjrt.jar和aspectjweaver.jar才能工作?

    确切的说,应该只需要aspectjweaver.jar, aspectjrt.jar是aspectjweaver.jar的子集。Spring-aspects 实现类似aspectj注解方式的时候,借用了aspectjweaver.jar中定义的一些annotation和class,然而其并不使用Aspectj的字节码织入功能。

    spring-aspects 不能把这些所需的类定义抄一份过去吗,这样就不需要aspectjweaver.jar了

    他们可以,但是他们偏不这样做

    原文http ://www.udpwork.com/item/15373.html

     http://ju.outofmemory.cn/entry/251194

  • 相关阅读:
    javascript Math.random()随机数函数
    asp.net 前台获取后台c#代码信息
    关于C#网站一般处理程序(ashx)中session的问题
    怎样才能在一般处理文件中创建新的Session和访问已经存在的Session?
    使用SqlParameter向数据库中插入数据
    C#串口编程学习简单实例
    认识nodejs
    01.Javascript中的接口Interface [转载]
    动态添加脚本,并触发回调函数 初步实现按需加载
    JS正则表达式 收藏
  • 原文地址:https://www.cnblogs.com/softidea/p/6222629.html
Copyright © 2011-2022 走看看