主要说下spring里aop的生效的原理吧,并不是讲底层的cglib和gdk动态代理。

还是老一套的分析流程,先找到了aop的标签的handler,然后看下在解析这个标签的时候,都干了些什么,其实主要就是看下注册了哪些bean,哪些beanPostProcessor. 因为看了那么多的spring的功能实现,基本都是通过这些beanPostProcessor来搞事情的,这个应该也不例外。

Ok,首先一眼会看到,把我们配置的pointCut,advisoe等组装成beanDefinition,向容器注册,这些bean的主要作用只是记录我们配置的那些数据(切入点,目标类,intercepter类等等),并不是什么很重要的部分。然后还看到注册了一个类 :AspectJAwareAdvisorAutoProxyCreator, 这个类是spring中aop生效的核心。

看下继承关系,发现它实现了beanPostProcessor这个接口,ok,和我们一开始的猜测是一样的,然后再看下里边的实现,然后具体里边的实现呢,就不很详细的写了,大体的流程是这样的。

一个Bean开始实例化—> 调用AspectJAwareAdvisorAutoProxyCreator里实例化bean的回调接口,看下能否提前将bean实例化,并创建代理,然后返回最终的代理类 —> 上述失败后,走正常的实例化流程 —> 在bean实例初始化后,调用AspectJAwareAdvisorAutoProxyCreator的beanpostProcessor回调接口 —> 如果还没有拿到所有的advisor实例,先拿到容器里所有的advisor实例,然后for循环去判断当前的这个bean是否应该进行代理,不应该的话,直接返回 —> 根据advisor中的信息,开始对bean进行代理,注意,如果这个bean有多个advisor的话,这里会把适用的advisor都拿出来,作为代理中的interceptor,然后选择采用哪种代理方式,进行底层的代理过程,最后返回被代理后的类。

这里需要注意的是,AspectJAwareAdvisorAutoProxyCreator一定要先于其他普通的bean被实例化,然后,回顾下容器初始化的过程,确实是会先实例化所有的processor,最后才会对普通的bean进行实例。 具体什么样的bean会被实例,什么样的会被延迟实例化,前面的文章中有专门讲过,这里就不多说了。ps:这些beanPostProcessor 内部也是可以设置实例化的优先级的,高优先级的会被先初始化,这个有的时候还是比较重要的,需要留意下。

spring-aop代理的生效原理的更多相关文章

  1. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  2. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  3. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  4. jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  5. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)

    Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...

  6. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  7. Spring AOP /代理模式/事务管理/读写分离/多数据源管理

    参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...

  8. Spring aop 原始的工作原理的理解

    理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...

  9. Spring AOP的底层实现原理

    Spring的两大核心之一就是AOP,AOP:面向切面编程.在说原理之前,得先知道一些 AOP的专业术语. AOP的专业术语 连接点(JoinPoint):增强执行的位置(增加代码的位置),Sprin ...

  10. Spring Aop之Cglib实现原理详解

    Spring Aop实现对目标对象的代理,AOP的两种实现方式:Jdk代理和Cglib代理.这两种代理的区别在于,Jdk代理与目标类都会实现同一个接口,并且在代理类中会调用目标类中被代理的方法,调用者 ...

随机推荐

  1. hdu 1686 & poj 2406 & poj 2752 (KMP入门三弹连发)

    首先第一题 戳我穿越;http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意好理解,每组输入一个子串和一个母串,问在母串中有多少个子串? 文明人不要暴力 ...

  2. java8 数据结构的改变(二) 对ConcurrentHashMap影响

    https://www.cnblogs.com/study-everyday/p/6430462.html http://www.importnew.com/22007.html

  3. linux使用笔记4

    运行已经安装好的软件: cd到这个软件的安装目录 输入命令/:./软件名称 就可以了 运行geoserver 1.首先需要添加JAVA_HOME的环境变量: 在服务器没有设置JAVA_HOME的情况下 ...

  4. 1.2 Java中的注释

    Eclipse中的快捷键  单行注释   Ctrl+/ 多行注释    Ctrl+Shift+/  文档注释    Shift +Alt+j /** * @author Lenovo * 文档注释 * ...

  5. Loadrunner 脚本录制策略

    Loadrunner在脚本录制过程中,我们会先后分别碰见init.action.transaction.end.block等概念.本次打算以图文并茂的形式为大家分别讲解. 以下为一个简要的网站操作逻辑 ...

  6. NC 5系查询引擎做报表

    在集团下打开查询引擎管理节点,选中查询设计,鼠标移动到创建,点击文件夹 文件夹名字按需求起,创好文件夹后选中该文件夹后鼠标移动到创建,点击对象. 按需求起好编码和名称 都创建好后,点击SQL手工设计 ...

  7. Python之路(第十三篇)time模块、random模块、string模块、验证码练习

    一.time模块 三种时间表示 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.(从 ...

  8. 基于tomcat的solr环境搭建(Linux)

    ♥♥  solr是基于lucene的一个全文检索服务器,提供了一些类似webservice的API接口,用户可以通过http请求solr服务器,进行索引的建立和索引的搜索.索引建立的过程:用户提交的文 ...

  9. 蛋白序列GO号注释及问题

    #===============================      版本1  ===============================================InterProSc ...

  10. HQL和SQL查询

     转自http://blog.csdn.net/aaa1117a8w5s6d/article/details/7757097 HQL和SQL的区别 标签: sqlhibernatejavasessio ...