Spring AOP:用注释替换XML进行事务管理?

时间:2016-01-10 14:27:52

标签: spring annotations aop

我想知道是否可以替换此代码:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true" />  
        <tx:method name="saveFile" isolation="SERIALIZABLE" propagation="REQUIRED" no-rollback-for="BusinessException" />
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

<!--Transaction aspect-->
<aop:config>
    <aop:pointcut id="businessOperation"
        expression="execution(* com.application.app.business.*.*(..)) || execution(* com.application.app.logic..*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="businessOperation" />
</aop:config>   

有完整的注释而且根本没有XML吗?我的意思是在事务管理器上定义一个方面做同样的事情。

我能够定义一个方面和切入点,但我不知道如何在事务管理器上获取并采取行动。

提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

<tx:advice />所做的基本上是注册TransactionInterceptorPlatformTransactionManager注入了@Bean public TransactionInterceptor transactionInterceptor(PlatformTransactionManager transactionManager) { return new TransactionInterceptor(transactionManager, transactionAttributeSource()); } @Bean public NameMatchTransactionAttributeSource transactionAttributeSource() { NameMatchTransactionAttributeSource tas = new NameMatchTransactionAttributeSource(); RuleBasedTransactionAttribute gets = new RuleBasedTransactionAttribute(); gets.setReadOnly(true); RuleBasedTransactionAttribute saveFile = new RuleBasedTransactionAttribute(8, Collections.singletonList(new NoRolebackRuleAttribute(BusinessException.class); Map<String, AttributeSource> matches = new HashMap<>(); matches.put("get*", gets); matches.put("saveFile", saveFile); return tas; } 并使用<tx:method />元素的不同规则进行设置。

要复制此类内容,应在基于Java的配置中完成以下操作。

<aop:pointcut />

现在接下来的部分是您需要手动定义切割点。为此,您需要构建AspectJExpressionPointcutAdvisor。这也是@Bean public AspectJExpressionPointcutAdvisor transactionAdvisor(TransactionInterceptor advice) { AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor(); advisor.setAdvice(advice); advisor.setExpression("execution(* com.application.app.business.*.*(..)) || execution(* com.application.app.logic..*.*(..))"); return advisor; } 标记所做的事情。

@Transactional

如果要复制xml配置,那应该是您需要做的。不过我建议转而使用int64_t,这样设置起来要容易得多。