AOP的实现有哪些

AOP常见的实现有:

  • Spring AOP
  • Aspectj
  • Guice AOP
  • Jboss AOP

AOP Alliance 是什么, 为什么Spring AOP, G UICE 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

Spring AOP 问与答的更多相关文章

  1. 求求你,下次面试别再问我什么是 Spring AOP 和代理了!

    https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9403056301388627935% ...

  2. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  3. 从源码层面聊聊面试问烂了的 Spring AOP与SpringMVC

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  4. Spring AOP 随记

    本周经历各种面试失败后,最后一站张建飞老大的阿里,感觉有着这般年纪不该有的垃圾履历而忧伤中,不过还是要继续加油的,毕竟他说的好,都是经历,无愧初心. 所以为了更加深入理解Spring AOP我又翻起了 ...

  5. 面试官:连Spring AOP都说不明白,自己走还是我送你?

    前言 因为假期原因,有一段时间没给大家更新了!和大家说个事吧,放假的时候一位粉丝和我说了下自己的被虐经历,在假期前他去某互联网公司面试,结果直接被人家面试官Spring AOP三连问给问的一脸懵逼!其 ...

  6. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  7. spring aop获取目标对象的方法对象(包括方法上的注解)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  8. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  9. Spring - AOP简介与图示

    [1]AOP (Aspect-Oriented Programming, 面向切面编程),是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) ...

随机推荐

  1. p4-hlir/test源码 stateful.p4 control_flow_opt.p4

    stateful.p4 #include "includes/headers.p4" #include "includes/parser.p4" action ...

  2. PHP 下载导出中文名的文件的编码注意事项

    我的页面全部都为utf-8 在代码中我的文件名是中文名. 在创建文件时,就要将utf-8转码成gbk(用以支持中文) $file = iconv('utf-8',"gbk",$fi ...

  3. 各种常用的JSON接口,开动你的大脑你就可以做出各种应用,值得收藏

    各种常用的JSON接口,开动你的大脑你就可以做出各种应用,值得收藏   浏览:1412 发布日期:2014/01/27 分类:技术分享 这里为大家搜集了一些能够返回JSON格式的服务接口.部分需要用J ...

  4. 页面静态化2 --- 使用PHP缓存机制来完成页面静态化(上)(ob_flush和flush函数区别用法)

    我们可以使用PHP自带的缓存机制来完成页面静态化,但在这里,需要说明一点,仅靠PHP缓存机制并不能完美的解决页面静态化,往往需要和其他页面静态技术(通常是伪静态技术)结合使用 例子: 当访问一个页面时 ...

  5. using System.Diagnostics; 日志操作

    using System.Diagnostics 命名空间 包含了能够与系统进程 事件日志 和性能计数器进行交互的类 一般用于帮助诊断和调试应用程序 例如 Debug类用于帮组调试代码 Process ...

  6. 【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)

    本文将给大家阐述一个因未设置系统环境变量ORACLE_SID导致ORA-12162错误的案例.希望大家有所思考. 1.获得有关ORA-12162报错信息的通用表述信息 [oracle@asdlabdb ...

  7. Linux core 文件介绍

    Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个 ...

  8. crucible3.x +fisheye3.x 安装和破解

    2015-11-24 22:29 423人阅读 评论(1) 收藏 举报  分类: linux(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 破解文件下载路径:http://downlo ...

  9. 15 款最好的 C/C++ 编译器和集成开发环境

    我们有很多编程语言来进行 web 开发,比如 Java,.Net,PHP,Ruby,Perl,Python 等等.今天我们主要讨论的是两大古老而又流行的语言: C 和 C++ ,它们有着许多卓越的特性 ...

  10. js实现表格中不同单元格内容的替换(不同浏览器的节点属性兼容问题)

      ------->   效果:点击右下角单元格,左下角单元格内容被替换成和左上角相同,如上图所示. 实现方式:分别获取各个节点,并将左边节点的内容修改成左上方节点的内容. 代码: 注意的地方: ...