spring aop 总结和疑点释义

1.png

AspectJ介绍:AspectJ是一个java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器)
AspectJ的织入方式及其原理概要:我们仍需要了解AspectJ应用到java代码的过程(这个过程称为织入),对于织入这个概念,可以简单理解为aspect(切面)应用到目标函数(类)的过程。对于这个过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过动态代理技术完成的,如Java JDK的动态代理(Proxy,底层通过反射实现)或者CGLIB的动态代理(底层通过继承实现),Spring AOP采用的就是基于运行时增强的代理技术,这点后面会分析,这里主要重点分析一下静态织入,ApectJ采用的就是静态织入的方式。ApectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类(即编译后的字节码包含了aspect代码)
ApectJ编译方式:当然除了编译期织入,还存在链接期(编译后)织入,即将aspect类和java目标类同时编译成字节码文件后,再进行织入处理,这种方式比较有助于已编译好的第三方jar和Class文件进行织入操作

spring aop和aspectj的关系:spring aop 更关注于与ioc的结合,底层采用动态编译即jdk动态代理和cglib,并按照aspectj风格进行aop的开发(比如设置apsectj注解,定义pointcut advice advisor等)

InstantiationAwareBeanPostProcessor 在BeanPostProcessor基础上增加 实例化前后的扩展点(BeanPostProcessor是在bean初始化前后进行操作)

AspectJ的逻辑

1.在初始化之后开始调用,就是解析某个类是否需要变成代理
2.判断是否需要代理的原则,找到这个类是否有对应的advisor,如果有就是需要变成代理
3.如何去寻找advisor,针对于asepctJ是去寻找对应的@AsepctJ的注解类,然后获取所有的adviosr 然后解析advisor上面的pointcut,看看ponitcut是否匹配目前的类或者方法
4.当存在advisor之后在advisor集合里面第一位添加ExposeInvocationInterceptor,该类是作为调用链的头部 可以方便的获取调用链上下文
5.不论是jdk还是cglib调用的都是ReflectiveMethodInvocation的process方法,即spring把advisor转换成MethodInterceptor
该方法内部就是循环调用MethodInterceptor,当调用链结束了才调用 真正方法
整个逻辑类似递归调用。
6.依靠proxyfactory创建代理对象
@Asepctj的aop生成源码解析:https://www.jianshu.com/p/58e0828c062c

ProxyFactoryBean的逻辑

和proxyfactoryBean的aop源码解析:https://www.jianshu.com/p/e376014e6795


之所以在源码中创建代理采用proxyFactory 而不是AspectJrpoxyFactory是因为这是父类 如果AspectJrpoxyFactory,会导致不适配其他类型,而且proxyfactory 有通用性,因为他们创建aopproxy的方法都是一样 只是收集advice不一样,而advice已经被收集到了


代理中遇到调用返回this方法会直接退换成proxy本身

cglib在创建proxy过程通过proxyfilter,来分配某些方法对应哪个callback,然后运行的执行哪个callback的intercept方法(不同的interceptor方法就是不同的callback方法的具体逻辑执行者)

springAop的更简单的总结:收集advisor 创建代理对象 把adviosr 转换成methodinterceptor 最终通过ReflectiveMethodInvocation(jdk)或者CglibMethodInvocation(其继承了ReflectiveMethodInvocation cglib)去执行这些interceptor,
ReflectiveMethodInvocation 逻辑:当我们只想对应的Interceptor要执行的内容,如果我们还需要只想下一步,就调用this.process,就又回到这个ReflectiveMethodInvocation的process方法


CGLIB:是在proxyproxy创建的时候进行method的intercept的分配和缓存
JDK:jdk 是在proxy第一次调用方法的进行method的intercept的分配和缓存


CglibMethodInvocation改写ReflectiveMethodInvocation的invokeJoinpoint方法,与使用反射相比,性能略有改善在调用公共方法时调用目标。(即JDK是通过method的invoke方法 而cglib通过MethodProxy的invoke)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 12,267评论 6 86
  • 我们的程序从编写到执行,单个模块一般都是从上到下、垂直、连续的。AOP是一种“横切”技术,能够在合适的地方“拦腰截...
    消失er阅读 1,940评论 0 5
  • 你曾出现在我的梦里,在梦里我看到了另一个你。在我眼里出现了你的倒影。 小毅是生活中大大咧咧没有教条的散漫性格...
    Zboomboomboom阅读 201评论 0 1
  • 电影 《教父》 小说 《三国演义》 体重 52kg Thinking In Java 类型信息 泛型 数组 容器
    Luna_Lu阅读 189评论 0 0
  • 作为一名“懒癌”,我觉得啃甘蔗是一件十分不便利的事情,比如不小心咬到自己、吃多易上火、咬来咬去让嘴巴发酸等等原...
    邓迟迟阅读 758评论 0 5