@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