@Transactional标识类或方法,使方法被执行时使用事务方式执行,这里只讨论PROXY方法增强方法。使用@EnableTransactionManagement,默认model=AdviceMode.PROXY,通过@Import(TransactionManagementConfigurationSelector.class)来判断在加载时注册PROXY不是ASPECTJ相关类。PROXY相关类有AutoProxyRegistrar和ProxyTransactionManagementConfiguration。AutoProxyRegistrar作用是通过EnableTransactionManagement.proxyTargetClass值判断使用CGLIB或是Java interface-based proxies。使用Java interface-based proxies时AnnotationAwareAspectJAutoProxyCreator,AnnotationAwareAspectJAutoProxyCreator是一个BeanPostProcessor实现类。使用CGLIB也是注册AnnotationAwareAspectJAutoProxyCreator并且将proxyTargetClass=true,如下AopConfigUtils.forceAutoProxyCreatorToUseClassProxying()

AnnotationAwareAspectJAutoProxyCreator.wrapIfNecessary()

AnnotationAwareAspectJAutoProxyCreator是一个BeanPostProcessor实现类,它的相应方法会在容器管理每个对象实例化不同阶段会执行。wrapIfNecessary()方法在postProcessAfterInitialization()方法调用,主要是判断实例化对象是否容器所有Advisor所要作用对象,如@Transactional标识的方法或类的对象匹配BeanFactoryTransactionAttributeSourceAdvisor。
AnnotationTransactionAttributeSource.determineTransactionAttribute()
判断传入的方法是否含@Transactional标识,返回TransactionAttribute
下面是AnnotationAwareAspectJAutoProxyCreator(AbstractAutoProxyCreator).wrapIfNecessary()的stack
Thread [main] (Suspended (breakpoint at line 348 in AbstractAutoProxyCreator))    
owns: ConcurrentHashMap<K,V>  (id=2343)    
owns: Object  (id=2107)    
AnnotationAwareAspectJAutoProxyCreator(AbstractAutoProxyCreator).wrapIfNecessary(Object, String, Object) line: 348    
AnnotationAwareAspectJAutoProxyCreator(AbstractAutoProxyCreator).postProcessAfterInitialization(Object, String) line: 298    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsAfterInitialization(Object, String) line: 435    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1721    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 581    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
48361312.getObject() line: not available    
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
CommonAnnotationBeanPostProcessor.autowireResource(BeanFactory, CommonAnnotationBeanPostProcessor$LookupElement, String) line: 512    
CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor$LookupElement, String) line: 483    
CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(Object, String) line: 617    
CommonAnnotationBeanPostProcessor$ResourceElement(InjectionMetadata$InjectedElement).inject(Object, String, PropertyValues) line: 172    
InjectionMetadata.inject(Object, String, PropertyValues) line: 89    
CommonAnnotationBeanPostProcessor.postProcessPropertyValues(PropertyValues, PropertyDescriptor[], Object, String) line: 317    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1353    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 579    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
48361312.getObject() line: not available    
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
CommonAnnotationBeanPostProcessor.autowireResource(BeanFactory, CommonAnnotationBeanPostProcessor$LookupElement, String) line: 512    
CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor$LookupElement, String) line: 483    
CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(Object, String) line: 617    
CommonAnnotationBeanPostProcessor$ResourceElement(InjectionMetadata$InjectedElement).inject(Object, String, PropertyValues) line: 172    
InjectionMetadata.inject(Object, String, PropertyValues) line: 89    
CommonAnnotationBeanPostProcessor.postProcessPropertyValues(PropertyValues, PropertyDescriptor[], Object, String) line: 317    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1353    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 579    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
48361312.getObject() line: not available    
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 193    
DefaultListableBeanFactory.preInstantiateSingletons() line: 747    
AnnotationConfigApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 861    
AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 542    
SpringApplication.refresh(ApplicationContext) line: 750    
SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
SpringApplication.run(String...) line: 327    
SpringApplication.run(Class<?>[], String[]) line: 1245    
SpringApplication.run(Class<?>, String...) line: 1233    
Application.main(String[]) line: 56    
如果对象是Advisor所要作用对象,则调用createProxy()生成proxy对象封闭目标对象,增强目标对象。如下面stack

Thread [main] (Suspended (breakpoint at line 441 in AbstractAutoProxyCreator))    
owns: ConcurrentHashMap<K,V>  (id=2343)    
owns: Object  (id=2107)    
AnnotationAwareAspectJAutoProxyCreator(AbstractAutoProxyCreator).createProxy(Class<?>, String, Object[], TargetSource) line: 441    
AnnotationAwareAspectJAutoProxyCreator(AbstractAutoProxyCreator).wrapIfNecessary(Object, String, Object) line: 349    
AnnotationAwareAspectJAutoProxyCreator(AbstractAutoProxyCreator).postProcessAfterInitialization(Object, String) line: 298    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsAfterInitialization(Object, String) line: 435    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1721    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 581    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
48361312.getObject() line: not available    
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
CommonAnnotationBeanPostProcessor.autowireResource(BeanFactory, CommonAnnotationBeanPostProcessor$LookupElement, String) line: 512    
CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor$LookupElement, String) line: 483    
CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(Object, String) line: 617    
CommonAnnotationBeanPostProcessor$ResourceElement(InjectionMetadata$InjectedElement).inject(Object, String, PropertyValues) line: 172    
InjectionMetadata.inject(Object, String, PropertyValues) line: 89    
CommonAnnotationBeanPostProcessor.postProcessPropertyValues(PropertyValues, PropertyDescriptor[], Object, String) line: 317    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1353    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 579    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
48361312.getObject() line: not available    
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class<T>) line: 198    
CommonAnnotationBeanPostProcessor.autowireResource(BeanFactory, CommonAnnotationBeanPostProcessor$LookupElement, String) line: 512    
CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor$LookupElement, String) line: 483    
CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(Object, String) line: 617    
CommonAnnotationBeanPostProcessor$ResourceElement(InjectionMetadata$InjectedElement).inject(Object, String, PropertyValues) line: 172    
InjectionMetadata.inject(Object, String, PropertyValues) line: 89    
CommonAnnotationBeanPostProcessor.postProcessPropertyValues(PropertyValues, PropertyDescriptor[], Object, String) line: 317    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1353    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 579    
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 498    
DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 305    
48361312.getObject() line: not available    
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 233    
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 303    
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 193    
DefaultListableBeanFactory.preInstantiateSingletons() line: 747    
AnnotationConfigApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 861    
AnnotationConfigApplicationContext(AbstractApplicationContext).refresh() line: 542    
SpringApplication.refresh(ApplicationContext) line: 750    
SpringApplication.refreshContext(ConfigurableApplicationContext) line: 386    
SpringApplication.run(String...) line: 327    
SpringApplication.run(Class<?>[], String[]) line: 1245    
SpringApplication.run(Class<?>, String...) line: 1233    
Application.main(String[]) line: 56    

AbstractAutoProxyCreator.createProxy()

DefaultAopProxyFactory.createAopProxy()
@Transactional标识增强对象是类所以创建proxy对象是ObjenesisCglibAopProxy

转载于:https://www.cnblogs.com/birdstudio/p/7639984.html

Spring-framework应用程序启动loadtime源码分析笔记(二)——@Transactional相关推荐

  1. Spring Boot 2.x 启动全过程源码分析(全)

    上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...

  2. Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

    转载自   Spring Boot 2.x 启动全过程源码分析(上)入口类剖析 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boo ...

  3. Dubbo源码分析-Spring与Dubbo整合原理与源码分析(二)

    Spring与Dubbo整合的整体流程(基于apache-dubbo-2.7.15) 因为dubbo有较多的兼容以前的代码比如@DubboReference 以前就有两个版本@Reference 和@ ...

  4. Spring Boot Dubbo 应用启停源码分析

    作者:张乎兴 来源:Dubbo官方博客 背景介绍 Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发.同时也整合了 Spring Boo ...

  5. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

  6. Android 9 (P) Zygote进程启动源码分析指南二

         Android 9 Zygote进程启动源码分析指南二 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  7. 【Android 插件化】VirtualApp 源码分析 ( 启动应用源码分析 | HomePresenterImpl 启动应用方法 | VirtualCore 启动插件应用最终方法 )

    文章目录 一.启动应用源码分析 1.HomeActivity 启动应用点击方法 2.HomePresenterImpl 启动应用方法 3.VirtualCore 启动插件应用最终方法 一.启动应用源码 ...

  8. linux显示启动logo源码分析以及修改显示logo

    1.linux显示启动logo整个流程分析 (1)logo图片在内核源码中是以ppm格式的文件保存,在编译内核时会把ppm格式的文件自动转换成.c文件,在c文件中会构造一个struct linux_l ...

  9. 开发 web 程序服务 之 源码分析

    文章目录 开发 web 程序服务 之 源码分析 前言 http 包源码 路由部分 监听和服务部分 mux 库源码 源码分析 创建路由 路由匹配 总结 开发 web 程序服务 之 源码分析 前言 本文的 ...

最新文章

  1. 一个简单文本处理问题的多种解法
  2. InfoPath开发经验小节
  3. latex 数学公式_数学公式、方程式 OCR 识别编辑 LaTeX 公式软件神器—极度公式
  4. 查看db2数据库名linux,【名说】DB2数据库备份与恢复(linux环境)
  5. 京东向上海提供超1600万件米面粮油等民生商品
  6. SERVER 2008 +MSSQL2008+SCCM安装记录
  7. 《Java核心技术 卷II》笔记——(12)安全加密
  8. SpringBoot+Vue项目个性化音乐推荐系统
  9. 全国大学生数学建模竞赛首战一等奖经验分享
  10. 机器学习在网络流量分类中的应用
  11. lstm 预测诗歌_预测诗歌运动
  12. 计算机x线成像检查,计算机X线成像(X光机成像)简述
  13. chromecast投屏_谷歌Chromecast与安卓Miracast投屏技术
  14. 高考数学必考知识点高中数学重点知识归纳
  15. 微信小程序实现当前页面多个视频文件只能播放一个视频,其他视频暂停,点击当前暂停当前
  16. 计算机网络实验Lab1 Test
  17. continue用法
  18. 使用spoon(kettle)工具抽取Elasticsearch的数据并入库
  19. 【2022保研经验帖】夏令营/九推/清北/浙大/南大/北理/北邮/中科院
  20. 你的计划为什么运行不下去?怎么破?

热门文章

  1. 电商等大型网站高可用,高负载架构借鉴方案(转载)
  2. Springboot 项目启动后执行某些自定义代码
  3. 微信小程序需要https后台的创业机会思考
  4. HashMap两种遍历数据的方式
  5. css3 animation 动画属性简介
  6. translateZ 带来的Z-index 问题
  7. iOS执行时工具-cycript
  8. POJ 2386 Lake Counting DFS水水
  9. micropython esp8266教程_(一)ESP8266/nodemcu如何使用MicroPython进行开发
  10. Linux下编译GDAL