Uso de la anotación personalizada TRANSACTIONATRIBUTSOURCE con TX: Driven de anotación

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

  •  25-10-2019
  •  | 
  •  

Pregunta

Necesito utilizar una anotación personalizada para el control de la entrada para interceptar los atributos de transacción. En este momento, hago esto usando el Interceptor de transacciones e inyectando esto en TransactionAttributesurCeAdVisor. Los proxies se crean utilizando defaultAdVisoraUtoproxyCreator como se indica a continuación.

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

Aquí, CustomAnnotationTransactionAttributesurce extiende AnnotationTransactionAttributesurce. ¿Hay alguna forma de forzar TX: impulsada por la anotación para usar mi CustomAntationTransactionAttributesurce para que pueda evitar todas estas configuraciones? . Leí en una de las publicaciones que esto podría hacerse usando BeanPostProcesss, pero no estoy seguro de cómo usarlo para este caso.

¿Fue útil?

Solución

<tx:annotation-driven> No hace nada de magia, solo registra casi las mismas definiciones de frijoles que lo haces manualmente (ver AnnotationDrivenBeanDefinitionParser).

Entonces, puede reemplazar las referencias a AnnotationTransactionAttributeSource de otros frijoles, o reemplazar la propiedad de nombre de clase en su definición. Este último se ve más simples (aunque más frágil con respecto a los cambios en el código de primavera) y se puede hacer por lo siguiente 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");
        }            
    }       
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top