Использование Custom AnnotationTransactionAttributeSource с tx: annotation-driven - PullRequest
2 голосов
/ 29 ноября 2011

Мне нужно использовать Custom AnnotationTransactionAttributeSource для перехвата атрибутов транзакции. Прямо сейчас я делаю это, используя TransactionInterceptor и внедряя это в TransactionAttributeSourceAdvisor. Прокси создаются с использованием DefaultAdvisorAutoProxyCreator, как указано ниже.

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

Здесь CustomAnnotationTransactionAttributeSource расширяет AnnotationTransactionAttributeSource. Есть ли способ заставить Tx: annotation-based использовать мой CustomAnnotationTransactionAttributeSource, чтобы я мог избежать всех этих конфигураций? , В одном из сообщений я прочитал, что это можно сделать с помощью BeanPostProcessors, но не уверен, как его использовать в этом случае.

1 Ответ

4 голосов
/ 30 ноября 2011

<tx:annotation-driven> не делает ничего волшебного, просто регистрирует почти те же определения бинов, что и вы вручную (см. AnnotationDrivenBeanDefinitionParser).

Таким образом, вы можете либо заменить ссылки на AnnotationTransactionAttributeSource из других bean-компонентов, либо заменить свойство имени класса в его определении. Последнее выглядит проще (хотя и более хрупко по отношению к изменениям в коде Spring) и может быть выполнено с помощью следующего 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");
        }            
    }       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...