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.pswp.cn/news/371015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371015.shtml
英文地址,請注明出處:http://en.pswp.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 代碼評估…