代码跟踪可以根据报错信息来反向分析

已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 创建代理类流程跟踪相关推荐

  1. spring service ,controller反向代理生成AOP代理类流程

    一.在applicationContext的beanFactory.preInstantiateSingletons方法中,会初始化所有的单例BEAN. 二. 1.AbstractAutowireCa ...

  2. Spring创建Bean的流程

    大致步骤 简单来说:Bean会经历四个阶段: 实例化–>属性赋值–>初始化–>销毁 具体来说: 实例化:new xxx():有两个时候会触发实例化: 像容器申请一个Bean的时候 当 ...

  3. spring AbstractBeanDefinition创建bean类型是动态代理类的方式

    1.接口 Class<?> resourceClass 2.获取builder BeanDefinitionBuilder builder = BeanDefinitionBuilder. ...

  4. Spring 从入门到精通 (十六) AOP底层如何创建动态代理类

    关键词:Spring | AOP | 创建代理类 | 底层 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.创建对象三要素 ...

  5. 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象

    一.AOP概念 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建 ...

  6. Spring AOP源码(2)—AspectJAwareAdvisorAutoProxyCreator创建代理对象【两万字】

      基于最新Spring 5.x,介绍了Spring AOP中的AspectJAwareAdvisorAutoProxyCreator自动代理创建者的工作流程,对于创建代理对象的源码进行了深度分析! ...

  7. Spring 从入门到精通 (十七) AOP底层如何加工创建代理对象

    关键词:Spring | AOP | 创建对象 | 底层 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.疑问? 二.一张 ...

  8. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  9. 动态代理最全详解系列[2]-Proxy生成代理类对象源码分析

      之前我们通过JDK中的Proxy实现了动态代理,Proxy用起来是比较简便的,但理解起来不是那么清晰,是因为我们并没有看见代理类是怎么生成的,代理类怎么调用的被代理类方法,所以下面我们进入源码看一 ...

最新文章

  1. MPB:亚热带生态所谭支良、焦金真等-​反刍动物瘤胃样品采集与保存
  2. BTree,B-Tree,B+Tree,B*Tree
  3. SAP UI5 应用开发教程之十六 - 图标 icon 的使用
  4. 不思议迷宫c语言基础,不思议迷宫——新手入门所学
  5. Autofs自动挂在实现
  6. 安卓交换位置动画_好马配好鞍,OriginOS系统让安卓系统大变样
  7. go-micro 框架初探
  8. (转)互联网投顾平台的监管风险:和讯信息
  9. 高等数学 下册 第九章 多元函数的概念 笔记
  10. jQ+jQ UI制作的一个简单的二级可多选穿梭框
  11. 我的第一本社会心理学(part3)--自我概念
  12. 更改jenkins插件地址为国内源地址
  13. http解析库http-parser
  14. 2018蓝桥模拟赛 天上的星星
  15. 大计基作业记录(3)
  16. ApiPost 前后端协作开发神器 Postman+Swagger+Mock+Websocket的完美替代品
  17. SWFObject参数,SWFObject使用方法
  18. HCS12XEP100 ATD模块定时中断采样
  19. 电竞DOTA2数据API接口 - 【比赛详情】API调用示例代码
  20. 信号完整性基础04:串扰(2)

热门文章

  1. 计算机科技兴趣小组活动总结,信息技术兴趣小组活动总结
  2. pe我的手机服务器存档文件,我的世界手机版怎么导出存档 pe版怎么把存档给别人用...
  3. arcore与unity_Android ARCore –与相机的距离
  4. Python系统命令– os.system(),subprocess.call()
  5. android学习笔记_Intent
  6. 开课吧课堂之如何使用多重catch语句
  7. 开课吧课堂之如何创建多级类层次
  8. Java基础篇:短路逻辑运算符
  9. css-flex 常见面试题
  10. L1L2 Regularization的原理