我想通过Java以编程方式设置以下基于XML的事务AOP:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>
</aop:config>
到目前为止,我有以下内容。我可以像这样创建表达式切入点:
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* *..service.*Manager.*(..))");
然后可能使用AspectJPointcutAdvisor
和AspectJAroundAdvice
的组合我可以设置实际建议。
但是,在查看支持tx
命名空间的Spring代码时,似乎创建了TransactionInterceptor
。也许我看错了。
你问我为什么要这样做?
我已经将我的spring配置从XML移到了@Configuration类,但我仍然坚持如何翻译tx命名空间的东西。虽然,我正在使用@EnableTransactionManagement
和@Transactional
注释,但是将注释添加到上述切入点表达式匹配的所有方法中风险太大。我一定会错过一些东西。
答案 0 :(得分:1)
另一方面,您将事务应用于所有匹配的方法。我不建议你这样做。在表达式中非常具体,因为即使来自第三方库的方法也会有事务。而且这种方法的粒度也很差。我看到你正在添加相同的属性。
readOnly等属性非常重要。 readOnly事务不会刷新并结束。只是一个例子。