3

我想通过 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.*(..))");

然后也许使用AspectJPointcutAdvisorAspectJAroundAdvice我的组合可以设置实际的建议。

然而,在查看支持tx命名空间的 Spring 代码时,似乎 aTransactionInterceptor已创建。也许我看错了。

你问我为什么要这样做?

好吧,我已经将我的 spring 配置从 XML 移动到 @Configuration 类,但我一直坚持如何翻译 tx 命名空间的东西。虽然,我在使用@EnableTransactionManagement@Transactional注解,但是将注解添加到与上述切入点表达式匹配的所有方法中风险太大。我一定会错过一些东西。

4

1 回答 1

1

另一方面,您将事务应用于所有匹配的方法。我不建议你这样做。在表达式中要非常具体,因为即使来自第三方库的方法也会有事务。而且这种方法的粒度也很差。如我所见,您正在添加相同的属性。

像 readOnly 这样的属性非常重要。只读事务不会刷新并结束。只是一个例子。

于 2012-02-25T19:59:12.657 回答