當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
Spring-framework应用程序启动loadtime源码分析笔记(二)——@Transactional
生活随笔
收集整理的這篇文章主要介紹了
Spring-framework应用程序启动loadtime源码分析笔记(二)——@Transactional
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
@Transactional標(biāo)識(shí)類(lèi)或方法,使方法被執(zhí)行時(shí)使用事務(wù)方式執(zhí)行,這里只討論P(yáng)ROXY方法增強(qiáng)方法。使用@EnableTransactionManagement,默認(rèn)model=AdviceMode.PROXY,通過(guò)@Import(TransactionManagementConfigurationSelector.class)來(lái)判斷在加載時(shí)注冊(cè)PROXY不是ASPECTJ相關(guān)類(lèi)。PROXY相關(guān)類(lèi)有AutoProxyRegistrar和ProxyTransactionManagementConfiguration。AutoProxyRegistrar作用是通過(guò)EnableTransactionManagement.proxyTargetClass值判斷使用CGLIB或是Java?interface-based?proxies。使用Java?interface-based?proxies時(shí)AnnotationAwareAspectJAutoProxyCreator,AnnotationAwareAspectJAutoProxyCreator是一個(gè)BeanPostProcessor實(shí)現(xiàn)類(lèi)。使用CGLIB也是注冊(cè)AnnotationAwareAspectJAutoProxyCreator并且將proxyTargetClass=true,如下AopConfigUtils.forceAutoProxyCreatorToUseClassProxying()
AnnotationAwareAspectJAutoProxyCreator.wrapIfNecessary()
AnnotationAwareAspectJAutoProxyCreator是一個(gè)BeanPostProcessor實(shí)現(xiàn)類(lèi),它的相應(yīng)方法會(huì)在容器管理每個(gè)對(duì)象實(shí)例化不同階段會(huì)執(zhí)行。wrapIfNecessary()方法在postProcessAfterInitialization()方法調(diào)用,主要是判斷實(shí)例化對(duì)象是否容器所有Advisor所要作用對(duì)象,如@Transactional標(biāo)識(shí)的方法或類(lèi)的對(duì)象匹配BeanFactoryTransactionAttributeSourceAdvisor。 AnnotationTransactionAttributeSource.determineTransactionAttribute() 判斷傳入的方法是否含@Transactional標(biāo)識(shí),返回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???? 如果對(duì)象是Advisor所要作用對(duì)象,則調(diào)用createProxy()生成proxy對(duì)象封閉目標(biāo)對(duì)象,增強(qiáng)目標(biāo)對(duì)象。如下面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標(biāo)識(shí)增強(qiáng)對(duì)象是類(lèi)所以創(chuàng)建proxy對(duì)象是ObjenesisCglibAopProxy轉(zhuǎn)載于:https://www.cnblogs.com/birdstudio/p/7639984.html
總結(jié)
以上是生活随笔為你收集整理的Spring-framework应用程序启动loadtime源码分析笔记(二)——@Transactional的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 01-JAVA语言基础
- 下一篇: 洛谷-P1160 队列安排