L'utilisation AnnotationTransactionAttributeSource personnalisée avec tx: annotation-conduit

StackOverflow https://stackoverflow.com/questions/8316747

  •  25-10-2019
  •  | 
  •  

Question

Je dois utiliser un AnnotationTransactionAttributeSource personnalisé afin d'intercepter les attributs de transaction. En ce moment, je le fais en utilisant le TransactionInterceptor et l'injection dans ce proxies TransactionAttributeSourceAdvisor .Les sont créés à l'aide DefaultAdvisorAutoProxyCreator comme indiqué ci-dessous.

<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>

Ici, CustomAnnotationTransactionAttributeSource étend AnnotationTransactionAttributeSource. Est-il possible que je peux forcer Tx: annotation conduit à utiliser mon CustomAnnotationTransactionAttributeSource pour que je puisse éviter toutes ces configurations? . Je lis dans l'un des postes que cela pourrait être fait en utilisant BeanPostProcessors mais ne savez pas comment l'utiliser pour ce cas.

Était-ce utile?

La solution

<tx:annotation-driven> ne fait rien la magie, il enregistre tout près les mêmes définitions de haricots que vous ne manuellement (voir AnnotationDrivenBeanDefinitionParser ).

Ainsi, vous pouvez remplacer les références à AnnotationTransactionAttributeSource d'autres haricots, ou remplacer la propriété de nom de classe dans sa définition. Ce dernier aspect (bien simplier plus fragiles par rapport aux changements dans le code du printemps) et peut être fait par le BeanFactoryPostProcessor suivant:

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");
        }            
    }       
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top