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

@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

具有Spring的简单工作流引擎

几个月前&#xff0c;在处理一个公司项目时&#xff0c;我们需要开发REST服务&#xff0c;该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间&#xff0c;我们决定创建简单的工作流引擎&#xff0c;该引擎将为发送电子邮件收费&#xff0c;但该引擎也可用…

php put 参数,php – 如何在Guzzle 5中发送PUT请求的参数?

根据the manual,The body option is used to control the body of an entity enclosingrequest (e.g., PUT, POST, PATCH).记录的put’ing方法是&#xff1a;$client new GuzzleHttp\Client();$client->put(http://httpbin.org, [headers > [X-Foo > Bar],body > …

TypeScript学习笔记归纳(持续更新ing)

文章目录 前言 二、TypeScript的优势体现在哪里&#xff1f; 1、执行时间上的区别 2、基础数据类型区别 3、TS优势 三、TypeScript的关键特性 四、TypeScript的类型系统 1、什么是类型注释&#xff1f; 2、类型系统核心 - 常用类型 1&#xff09; 基本类型&#xff0…

组态王 6.55 启停plc_永宏PLC在远程控制系统中的应用

一、行业介绍本远程控制系统是给石药集团的下属子公司设计的一个控制方案。主要是配套GPRS-DTU产品实现远程plc与plc之间的数据共享。从而达到远程无线数据写入控制和读取监控的目的。二、客户需求(1) 客户可以在监控室控制至少2-3公里外的井上两个水泵的启动和停止。(2) 客户可…

Vue表格中,对数据进行转换、处理

众所周知&#xff0c;后端从Mysql取出的数据&#xff0c;一般是很难单独处理某一个Key的数据的&#xff08;需要处理的话&#xff0c;可能会浪费大量的性能。而且对页面加载时间有很大的影响&#xff09;&#xff0c;所以&#xff0c;从数据库取出的数据。只能由前端进行处理。…

Java应用程序中的SQL注入

在本文中&#xff0c;我们将讨论什么是SQL注入攻击。 以及它如何影响任何Web应用程序使用后端数据库。 在这里&#xff0c;我专注于Java Web应用程序。 开放Web应用程序安全项目&#xff08;OWAP&#xff09;列出了SQL注入是Web应用程序的主要漏洞攻击。 黑客将Web请求中的SQL代…

【转】ReactNativeweexDeviceOne对比

React Native出来有一段时间了&#xff0c;国内的weex和deviceone是近期发布的&#xff0c;我可以说从2011年就开始关注快速开发的跨平台平台技术了&#xff0c;接触过phoneGap、数字天堂、appcan等早期的移动中间件技术&#xff0c;也跟朋友也讨论过这类的轻量级框架。这些年通…

bluetooth射频已关闭请打开bluetooth射频_希杰大功率射频放大器烧了维修诊断步骤...

如果电阻值过低&#xff0c;说明电源内部存在短路&#xff0c;正常时其阻值应能达到100千欧以上;电容器应能够充放电&#xff0c;如果损坏&#xff0c;则表现为AC电源线两端阻值低&#xff0c;呈短路状态&#xff0c;否则可能是开关管击穿。然后检查直流输出部分脱开负载&#…

java中整数如何表示,在Java中如何在位级别上内部表示整数?

慕瓜9086354Java整数为32位&#xff0c;并且总是带符号的。这意味着&#xff0c;最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下&#xff1a;Bit# Weight31 -2^3130 2^3029 2^29... ...2 2^21 2^10 …

洛谷-P1160 队列安排

题目 Problem Description 一个学校里老师要将班上N个同学排成一列&#xff0c;同学被编号为1&#xff5e;N&#xff0c;他采取如下的方法&#xff1a; 1.先将1号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2.2&#xff5e;N号同学依次入列&#xff0c;编号…

1.HTML小结

HTML 基本文档 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>文档标题</title> </head> <body> 可见文本... </body> </html> <!DOCTYPE html>html文件声明。charset"UTF-8…

方法参数名称和Spring

继续之前的博客文章有关构造函数和方法参数以及Java在运行时不保留参数名称的情况–先前的文章涉及构造函数不保留参数名称及其对Spring中的Contructor注入的含义&#xff0c;在此我将介绍更多内容不保留参数名称的情况对Spring有影响&#xff1a; 1.考虑带参数的Spring MVC C…

Fragment Or DialogFragment Can not perform this action after onSaveInstanceState

转载&#xff1a;http://blog.csdn.net/chenshufei2/article/details/48747149 public void show(FragmentManager manager, String tag) {mDismissed false;mShownByMe true;FragmentTransaction ft manager.beginTransaction();ft.add(this, tag);ft.commit(); //注意这里…

php延迟更新,ThinkPHP开发指南-模型-高级模型之延迟更新

导航&#xff1a;上一页我们经常需要给某些数据表添加一些需要经常更新的统计字段&#xff0c;例如用户的积分、文件的下载次数等等&#xff0c;而当这些数据更新的频率比较频繁的时候&#xff0c;数据库的压力也随之增大不少&#xff0c;我们可以利用高级模型的延迟更新功能缓…

three.js制作3d模型工具_3D打印模型打磨抛光常用工具

对于追求更好模型品质的人来说&#xff0c;对3D打印模型进行后处理工作是必不可少的&#xff0c;而后处理&#xff0c;首要的便是对模型进行打磨、抛光&#xff0c;将不属于模型的耗材去除&#xff0c;提高表面光洁度。在此工作中&#xff0c;我们需要用到很多工具&#xff0c;…

Linux中文档去掉windows文本的多余的回车符(^M)

1) 使用sed 去掉windows下的回车符 &#xff08;注意^M 在linux 下写法 按^M 是回车换行符,输入方法是按住CTRLv,松开v,按m)sed -i s/^M//g filename 2) 在vim下类似 :%s/^M//g &#xff08;^M输入方法和上面方法相同&#xff09; 3) 使用dos2unix dos2unix filename 个人觉得第…

为何要清除浮动?如何清除?

原因&#xff1a; 元素设置了float属性后&#xff0c;就会脱离文档流&#xff0c;当 包含框 的高度小于 浮动框 的时候&#xff0c;会出现高度塌陷。因此才需要清除浮动&#xff01; 表现如图&#xff1a;包括框container已经包不住float的图片了&#xff01; 清除浮动方法&a…

Spring MVC错误处理示例

这篇文章描述了在Spring MVC 3中执行错误处理的不同技术。该代码在GitHub上的Spring-MVC-Error-Handling目录中可用。 它基于带有注释的Spring MVC示例。 在Spring 3之前处理异常 在Spring 3之前&#xff0c;使用HandlerExceptionResolvers处理异常。 此接口定义一个方法&…

PLSQL 学习之路(1)创建用户,表空间,表,数据

1.用SYS用户登录PL/SQL SYSXE as SYSDBA 2.创建表空间 create tablespace Mars datafile F:\oracle\Mars.dbf size 500M autoextend on next 100M maxsize unlimited logging extent management local autoallocate segment space management auto; 3.创建用户 create user Mar…

php数字取反,[转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)

PHP7和PHP5上的安全区别preg_replace()不再支持/e修饰符利用\e修饰符执行代码的后门大家也用了不少了&#xff0c;具体看官方的这段描述:如果设置了这个被弃用的修饰符&#xff0c; preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估…