我想知道是否可以替换此代码:
<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?我的意思是定义一个在事务管理器上执行相同操作的方面。
我可以定义一个方面和切入点,但是我看不到如何获得事务管理器并采取行动。
预先感谢您的回答。
最佳答案
<tx:advice />
所做的基本上是注册一个 TransactionInterceptor
,该文件将注入PlatformTransactionManager
,并为 <tx:method />
元素设置不同的规则。
要复制此内容,应在基于Java的配置中执行以下操作。
@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;
}
现在,下一部分是您需要手动定义切点。为此,您需要构造一个
AspectJExpressionPointcutAdvisor
。这也是<aop:pointcut />
标记完成的操作。@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;
}
如果要复制xml配置,那应该是您需要做的。但是我建议改用
@Transactional
,它更容易设置。