2011-11-29 64 views
2

我需要使用自定義AnnotationTransactionAttributeSource爲了攔截事務屬性。現在,我使用TransactionInterceptor執行此操作,並在TransactionAttributeSourceAdvisor中注入此代理。使用DefaultAdvisorAutoProxyCreator創建代理,如下所示。使用自定義AnnotationTransactionAttributeSource tx:註釋驅動

<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:註解驅動來使用我的CustomAnnotationTransactionAttributeSource,這樣我就可以避免所有這些配置? 。我在其中一篇文章中讀到,這可以通過使用BeanPostProcessors來完成,但不知道如何在這種情況下使用它。

回答

4

<tx:annotation-driven>沒有做任何魔術,它只是手動註冊幾乎相同的bean定義(請參閱AnnotationDrivenBeanDefinitionParser)。

因此,您可以從其他bean中替換對AnnotationTransactionAttributeSource的引用,或者在其定義中替換類名稱屬性。後者看起來simplier(雖然比較脆弱相對於春代碼更改),並可以通過以下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"); 
     }    
    }  
} 
+0

正是我所需要的。謝謝 。 –

+0

只是爲了記錄,當使用''東西時,您並不直接定義'AnnotationTransactionAttributeSource' bean,但這似乎可以取代默認獲取的bean。謝謝! – Gray

+0

我經歷了控制流沒有從'getBeanNamesForType'返回。使用'getBeanNamesForType'和其他參數false和false解決了這個問題。 – mm759