Verwendung benutzerdefinierter AnnotationTransactionAttributesource mit TX: Annotationsgetrieben

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

  •  25-10-2019
  •  | 
  •  

Frage

Ich muss eine benutzerdefinierte AnnotationTransactionAttributesource verwenden, um Transaktionsattribute abzufangen. Im Moment mache ich dies mit dem TransactionInterceptor und injiziere dies in TransactionAttributesourceadvisor. Die Proxys werden unter Verwendung von DefaultAdvisorautoproxyCreator erstellt, wie unten angegeben.

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

Hier erweitert die CustomannotationTransactionAttributesource AnnotationTransactionAttributesource. Gibt es eine Möglichkeit, TX: Annotationsbetrieben zu erzwingen, um meine CustomannotationTransactionAttributesource zu verwenden, damit ich all diese Konfigurationen vermeiden kann? . Ich habe in einem der Beiträge gelesen, dass dies mit den BeanpostProcessors erfolgen könnte, aber nicht sicher ist, wie ich es für diesen Fall verwenden soll.

War es hilfreich?

Lösung

<tx:annotation-driven> tut nichts Magie AnnotationDrivenBeanDefinitionParser).

Sie können also entweder Referenzen ersetzen AnnotationTransactionAttributeSource aus anderen Bohnen oder ersetzen Sie die Eigenschaft der Klassennamen in seiner Definition. Letzteres sieht einfacher aus (wenn auch in Bezug auf Änderungen im Federcode zerbrechlicher) und kann durch Folgendes erfolgen 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");
        }            
    }       
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top