最新コミットのコードを読む
今回は、ウェブアプリケーションを立ち上げる際に、@Transactional
アノテーションがどのようにしてロードされて呼び出されているのかを見る
利用されるのは、spring-tx
、spring-beans
、spring-context
、spring-web
の4つのプロジェクト
spring-tx
SpringTransactionAnnotationParser.parseTransactionAnnotation
AnnotationTransactionAttributeSource.findTransactionAttribute(Method/Class)
AbstractFallbackTransactionAttributeSource.computeTransactionAttribute
AbstractFallbackTransactionAttributeSource.getTransactionAttribute
TransactionAspectSupport.invokeWithInTransaction
- ここでTransactionAttrubute、PlatformTransactionManagerがある場合のみ、Transaction処理が実行される
TransactionInterceptor.invoke
(MethodInterceptor)AnnotationDrivenBeanDefinitionParser.AopAutoProxyConfigurer
TxNamespaceHandler.init
spring-beans
NamespaceHandlerSupport.resolve
BeanDefinitionParserDelegate.parseCustomElement/decorateIfRequired
- ...
BeanDefinitionParserDelegate.parseBeanDefinitionElement
DefaultBeanDefinitionDocumentReader.registerBeanDefinitions
XmlBeanDefinitionReader.registerBeanDefinitions
- ...
XmlBeanDefinitionReader.loadBeanDefinitions
- ...
GenericXmlApplicationContext.load
- ...
ConfigurationClassBeanDefinitionReader.loadBeanDefinitions
ConfigurationClassPostProcessor.processConfigBeanDefinitions
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry
spring-context
PostProcessRegistrationDelegate.invokeBeanFactoryPostProcessors
AbstractApplicationContext.invokeBeanFactoryPostProcessors
AbstractApplicationContext.refresh
spring-web
ContextLoader.configureAndRefreshWebApplicationContext
ContextLoader.initWebApplicationContext
ContextLoaderListener.contextInitialized
(ServletContextListener)
ということで、ServletContextListener
に辿り着いた
逆に読んで言葉にしていくと、以下のフロー
ServlecContextListener
としてContextLoaderListener
が読み込まれる- ApplicationContextの読み込み
- Beanの登録(設定ファイル等)
- springのhandlerの仕組みを利用して、
TxNamespaceHandler
を読み込む - MethodInterceptorとして、
TransactionInterceptor
を定義 @Transactional
のついたメソッドに対し、定義されたTransaction処理を実行
spring.handlers
あたりどうなってるのか気が向いたら見る