Utilizzando personalizzato AnnotationTransactionAttributeSource con tx: annotazioni-driven
-
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.
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");
}
}
}