Uso de la anotación personalizada TRANSACTIONATRIBUTSOURCE con TX: Driven de anotación
-
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.
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");
}
}
}