Spring 创建代理类流程跟踪
代码跟踪可以根据报错信息来反向分析
已spring3.0.6为例的报错信息分析
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'b1' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)at com.uu.T.main(T.java:9) Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:67)at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:104)at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
动态代理生成入口
动态代理生成是在spring处于对象生命周期的后期,目标对象实例化以后会逐个调用容器中定义的 BeanPostProcessor来处理对象;
其中aop的BeanPostProcessor是只要你在配置文件中引入了 类似:<aop:....> 这样的标签就会自动注册到容器中;
具体逻辑可以参考文章(我觉得写得不错):
http://www.jianshu.com/p/867991f3daa0
aop jar包中
/META-INF/spring.handlers 内容:
http\://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler
自动执行 init() 方法
public void init() {// In 2.0 XSD as well as in 2.1 XSD.registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());// Only in 2.0 XSD: moved to context namespace as of 2.1registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());}
然后会自动执行
AspectJAutoProxyBeanDefinitionParser的parse方法,parse方法会调用 registerAspectJAnnotationAutoProxyCreatorIfNecessary方法
这个方法就会向容器中注册对应的 BeanPostProcessor
BeanPostProcessor 调用链会在我的下一篇文章中提到,即 refresh() 方法的重要部分;
转载于:https://www.cnblogs.com/aqu415/p/7850621.html
Spring 创建代理类流程跟踪相关推荐
- spring service ,controller反向代理生成AOP代理类流程
一.在applicationContext的beanFactory.preInstantiateSingletons方法中,会初始化所有的单例BEAN. 二. 1.AbstractAutowireCa ...
- Spring创建Bean的流程
大致步骤 简单来说:Bean会经历四个阶段: 实例化–>属性赋值–>初始化–>销毁 具体来说: 实例化:new xxx():有两个时候会触发实例化: 像容器申请一个Bean的时候 当 ...
- spring AbstractBeanDefinition创建bean类型是动态代理类的方式
1.接口 Class<?> resourceClass 2.获取builder BeanDefinitionBuilder builder = BeanDefinitionBuilder. ...
- Spring 从入门到精通 (十六) AOP底层如何创建动态代理类
关键词:Spring | AOP | 创建代理类 | 底层 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.创建对象三要素 ...
- 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象
一.AOP概念 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建 ...
- Spring AOP源码(2)—AspectJAwareAdvisorAutoProxyCreator创建代理对象【两万字】
基于最新Spring 5.x,介绍了Spring AOP中的AspectJAwareAdvisorAutoProxyCreator自动代理创建者的工作流程,对于创建代理对象的源码进行了深度分析! ...
- Spring 从入门到精通 (十七) AOP底层如何加工创建代理对象
关键词:Spring | AOP | 创建对象 | 底层 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.疑问? 二.一张 ...
- Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ
面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...
- 动态代理最全详解系列[2]-Proxy生成代理类对象源码分析
之前我们通过JDK中的Proxy实现了动态代理,Proxy用起来是比较简便的,但理解起来不是那么清晰,是因为我们并没有看见代理类是怎么生成的,代理类怎么调用的被代理类方法,所以下面我们进入源码看一 ...
最新文章
- MPB:亚热带生态所谭支良、焦金真等-​反刍动物瘤胃样品采集与保存
- BTree,B-Tree,B+Tree,B*Tree
- SAP UI5 应用开发教程之十六 - 图标 icon 的使用
- 不思议迷宫c语言基础,不思议迷宫——新手入门所学
- Autofs自动挂在实现
- 安卓交换位置动画_好马配好鞍,OriginOS系统让安卓系统大变样
- go-micro 框架初探
- (转)互联网投顾平台的监管风险:和讯信息
- 高等数学 下册 第九章 多元函数的概念 笔记
- jQ+jQ UI制作的一个简单的二级可多选穿梭框
- 我的第一本社会心理学(part3)--自我概念
- 更改jenkins插件地址为国内源地址
- http解析库http-parser
- 2018蓝桥模拟赛 天上的星星
- 大计基作业记录(3)
- ApiPost 前后端协作开发神器 Postman+Swagger+Mock+Websocket的完美替代品
- SWFObject参数,SWFObject使用方法
- HCS12XEP100 ATD模块定时中断采样
- 电竞DOTA2数据API接口 - 【比赛详情】API调用示例代码
- 信号完整性基础04:串扰(2)
热门文章
- 计算机科技兴趣小组活动总结,信息技术兴趣小组活动总结
- pe我的手机服务器存档文件,我的世界手机版怎么导出存档 pe版怎么把存档给别人用...
- arcore与unity_Android ARCore –与相机的距离
- Python系统命令– os.system(),subprocess.call()
- android学习笔记_Intent
- 开课吧课堂之如何使用多重catch语句
- 开课吧课堂之如何创建多级类层次
- Java基础篇:短路逻辑运算符
- css-flex 常见面试题
- L1L2 Regularization的原理