decadence

個人のメモ帳

SpringのアノテーションがLoadされるまでの流れ

github.com

最新コミットのコードを読む

今回は、ウェブアプリケーションを立ち上げる際に、@Transactionalアノテーションがどのようにしてロードされて呼び出されているのかを見る

利用されるのは、spring-txspring-beansspring-contextspring-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あたりどうなってるのか気が向いたら見る