Utilizzando personalizzato AnnotationTransactionAttributeSource con tx: annotazioni-driven

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

  •  25-10-2019
  •  | 
  •  

Domanda

Ho bisogno di usare un AnnotationTransactionAttributeSource personalizzato al fine di attributi di transazione intercettazione. In questo momento, lo faccio utilizzando il TransactionInterceptor e l'iniezione di questo proxy TransactionAttributeSourceAdvisor .Le vengono creati utilizzando DefaultAdvisorAutoProxyCreator come indicato di seguito.

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

Qui, CustomAnnotationTransactionAttributeSource estende AnnotationTransactionAttributeSource. C'è un modo posso forzare Tx: annotazioni-driven di usare la mia CustomAnnotationTransactionAttributeSource così che ho potuto evitare tutte queste configurazioni? . Ho letto in uno dei posti che questo potrebbe essere fatto utilizzando BeanPostProcessors ma non è sicuro come usarlo per questo caso.

È stato utile?

Soluzione

<tx:annotation-driven> non fa niente magia, solo registra quasi le stesse definizioni di fagioli come si fa manualmente (vedi AnnotationDrivenBeanDefinitionParser ).

Quindi, è possibile sostituire sia i riferimenti a AnnotationTransactionAttributeSource da altri fagioli, o sostituire proprietà nome della classe nella sua definizione. Quest'ultimo aspetto semplici di (anche se più fragili rispetto alle variazioni nel codice primavera) e può essere fatto dal seguente 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");
        }            
    }       
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top