Spring Aop 原理分析
@EnableAspectJAutoProxy Aop功能开启注解
为容器中导入 @Import(AspectJAutoProxyRegistrar.class)组件,在其重写方法中为 ioc容器 注册 AnnotationAwareAspectJAutoProxyCreator (Aspectj自动代理生成器)保存beandefinition;
明名为 "org.springframework.aop.config.internalAutoProxyCreator";(起名)
AnnotationAwareAspectJAutoProxyCreator initBeanFactory();
->AspectJAwareAdvisorAutoProxyCreator
->AbstractAdvisorAutoProxyCreator ----》 setBeanFactory();
->AbstractAutoProxyCreator implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware( 后置处理器 ,在bean,beanfactory初始化完成后做事情)
---->postProcessBeforeInstantiation();
流程
1.创建ioc容器,传入主配置类
2.注册配置类,调用Refresh()方法。
3.registerBeanPostProcessors(beanFactory);注册bean的后置处理器,来拦截bean的创建。
a:先获取ioc容器已经定义的需要创建对象的所有BeanPostProcessor(例如@EnableAspectJAutoProxy注解导入的 AnnotationAwareAspectJAutoProxyCreator );
b:给容器中加入别的BeanPostProcessor
c:优先注册实现PriorityOrder接口的BeanPostProcessor,下来是实现Order接口的,最后是没实现优先级接口的。
d:创建bean实例internalAutoProxyCreator ==== AnnotationAwareAspectJAutoProxyCreator
e:初始化bean包括 invokeAwareMethods() ---》 applyBeanPostProcessorsBeforeInitialization(应用后置处理器) ---》invokeInitMethods(执行类初始化方法(init))
---》 applyBeanPostProcessorsAfterInitialization
执行aware方法
4:完成剩余单实例bean的初始化 getBean -》 doGetBean -》
a:先从缓存中获取,如果可以获取到,说明之前被创建过。只要创建好的bean 都会被缓存起来
b:createBean -》AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation() // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
希望后置处理器在此能返回一个代理对象
1. 后置处理器先尝试返回对象
AnnotationAwareAspectJAutoProxyCreator 会在所有bean创建之前尝试创建代理对象
2.判断当前对象是否在advisedBeans中(保存了是否需要增强的bean)
Advice.class.isAssignableFrom(beanClass) ||
Pointcut.class.isAssignableFrom(beanClass) ||
Advisor.class.isAssignableFrom(beanClass) ||
AopInfrastructureBean.class.isAssignableFrom(beanClass) 和 shouldSkip(beanClass, beanName) 拿到候选的 增强器 findCandidateAdvisors()
after:
3.如果当前bean需要增强,则创建bean的代理对象
保存增强器到代理工厂,再创建代理对象。
通过jdk(基于接口式的代理)或cglib(通过继承父类)创建代理。下来容器中获取到的就是该对象的代理对象。
c:doCreateBean 完成真正的创建对象逻辑
AOP执行机制
1.以cglib为例 ,执行被代理方法时,代码会进入CglibAopProxy.intercept 方法
2.先获取将要执行方法的拦截器链。
3.创建一个CglibMethodInvocation对象,然后调用proceed方法。返回结果。
Spring Aop 原理分析的更多相关文章
- spring aop原理分析
持续更新... aop跟java代理模式有关. java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 工厂模式用到java反射. ao ...
- 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)
Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...
- Spring事务原理分析-部分二
Spring事务原理分析-部分二 说明:这是我在蚂蚁课堂学习了余老师Spring手写框架的课程的一些笔记,部分代码代码会用到余老师的课件代码.这不是广告,是我听了之后觉得很好. 课堂链接:Spring ...
- Spring事务原理分析-部分一
Spring事务原理分析-部分一 什么事务 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败. 事务基本特性 ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要 ...
- Spring事务原理分析--手写Spring事务
一.基本概念和原理 1.Spring事务 基于AOP环绕通知和异常通知的 2.Spring事务分为编程式事务.声明事务.编程事务包括注解方式和扫包方式(xml) Spring事务底层使用编程事务(自己 ...
- spring ioc 原理 spring aop原理
大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...
- Spring Boot -- Spring AOP原理及简单实现
一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...
- 【spring 注解驱动开发】Spring AOP原理
尚学堂spring 注解驱动开发学习笔记之 - AOP原理 AOP原理: 1.AOP原理-AOP功能实现 2.AOP原理-@EnableAspectJAutoProxy 3.AOP原理-Annotat ...
- Spring lazy-init 原理分析
普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发.Spring 启动的时候会把所有be ...
随机推荐
- Linux--如何实现虚拟机与主机之间的文件传输无需第三方,即可轻松设置共享文件夹(适合所有人群)
无需第三方插件,设置共享文件夹 第一步:虚拟机->设置 第二步:选项->共享文件夹->总是启用->添加 第三步:点击下一步 第四步:浏览(选择主机路径)->下一步 第五步 ...
- 手搓SSM
相关资料,网上的资料很多,但是文章看不懂,看别人写好的代码比较好理解 ssm-example mysssm 整个流程和原理 一个入口类,入口类需要在tomcat启动的时候执行 通过扫描文件加把文件取出 ...
- 「SPOJ1487」Query on a tree III
「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ...
- Java 在Excel单元格中应用一种/多种字体样式
在Excel表格中,设置单元格字体样式时,可以对单元格内的所有字符应用同一样式,即获取指定单元,应用样式即可:另外也可以对单元格内的不同字符内容应用不同字体样式,即获取单元格中的字符位置,应用样式:本 ...
- 2016 年 31 款轻量高效的开源 JavaScript 插件和库
目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...
- 微信红包系统设计 & 优化
微信红包系统设计 & 优化 浏览次数:151次 腾讯大讲堂 2015年04月02日 字号: 大 中 小 分享到:QQ空间新浪微博腾讯微博人人网豆瓣网开心网更多0 编者按:经过2014年一年 ...
- JSON传输图片帮助类
JSON传输图片帮助类 2014-05-27 16:11:22| 分类: Java | 标签:解决方案 java json |举报|字号 订阅 原理:将图片转换为字节流,再将字节流用 ...
- 组件公用数据 Vue.observable( )
注意(适合小项目,不用vuex的情况下使用) 1.创建store.js 最好和main.js平级创建文件 import Vue from 'vue' export const store = Vue. ...
- 使用MyCat实现MySQL读写分离
说明 配置MyCat读写分类前需要先配置MySQL的主从复制,参考我上一篇的文章,已经做了比较详细地讲解了. 环境 centos7.MySQL5.7.mycat1.6 配置MyCat账号密码和数据库名 ...
- ZCGL大数据平台性能优化
对HBase数据库建索引 参见:基于Phoenix对HBase建索引 https://www.cnblogs.com/ratels/p/11203313.html 将HBase访问微服务整合到模块 ...