복붙노트

[SPRING] tx : annotation-driven에서 Custom AnnotationTransactionAttributeSource 사용하기

SPRING

tx : annotation-driven에서 Custom AnnotationTransactionAttributeSource 사용하기

트랜잭션 특성을 가로 채기 위해 Custom AnnotationTransactionAttributeSource를 사용해야합니다. 바로 지금, TransactionInterceptor를 사용하고 TransactionAttributeSourceAdvisor에 이것을 주입합니다. 프록시는 아래에 주어진대로 DefaultAdvisorAutoProxyCreator를 사용하여 생성됩니다.

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <property name="transactionInterceptor" ref="txInterceptor"/>
</bean>

<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="txManager"/>
    <property name="transactionAttributeSource"> 
       <bean class="org.myProject.transaction.CustomAnnotationTransactionAttributeSource"/>
    </property>
</bean>

여기에서 CustomAnnotationTransactionAttributeSource는 AnnotationTransactionAttributeSource를 확장합니다. Tx를 강제로 설정할 수있는 방법이 있습니까? 주석 설정 방식으로 내 CustomAnnotationTransactionAttributeSource를 사용하여 이러한 모든 구성을 피할 수 있습니까? . 저는이 게시물 중 하나에서 BeanPostProcessors를 사용하여이 작업을 수행 할 수 있지만이 경우에는 사용 방법을 모르겠습니다.

해결법

  1. ==============================

    1.은 마술을 전혀하지 않으며, 수동으로 할 때와 거의 같은 bean 정의를 등록합니다 (AnnotationDrivenBeanDefinitionParser 참조).

    은 마술을 전혀하지 않으며, 수동으로 할 때와 거의 같은 bean 정의를 등록합니다 (AnnotationDrivenBeanDefinitionParser 참조).

    따라서 다른 Bean의 AnnotationTransactionAttributeSource에 대한 참조를 대체하거나 해당 정의에서 class name 속성을 바꿀 수 있습니다. 후자는 더 단순 해 보이지만 (스프링 코드의 변화에 ​​대해 더 취약 함) 다음 BeanFactoryPostProcessor로 수행 할 수 있습니다.

    public class AnnotationTransactionAttributeSourceReplacer implements BeanFactoryPostProcessor {
        public void postProcessBeanFactory(ConfigurableListableBeanFactory factory)
                throws BeansException {
    
            String[] names = factory.getBeanNamesForType(AnnotationTransactionAttributeSource.class);
    
            for (String name: names) {
                BeanDefinition bd = factory.getBeanDefinition(name);
                bd.setBeanClassName("org.myProject.transaction.CustomAnnotationTransactionAttributeSource");
            }            
        }       
    }
    
  2. from https://stackoverflow.com/questions/8316747/using-custom-annotationtransactionattributesource-with-txannotation-driven by cc-by-sa and MIT license