我正在学习Spring认证,我对通过XML配置文件进行的声明式transacion配置有以下疑问。
因此,我知道我可以配置必须是事务性行为的事务性行为注释类和\or方法,如下所示:
@Transactional(timeout=60)
public class RewardNetworkImpl implements RewardNetwork {
public RewardConfirmation rewardAccountFor(Dining d) {
// atomic unit-of-work
}
@Transactional(timeout=45)
public RewardConfirmation updateConfirmation(RewardConfirmantion rc) {
// atomic unit-of-work
}
}我还知道,有时我不能使用注释来配置类和\or方法的事务行为(例如,如果我没有包含必须以事务性方式工作的方法的类的Java代码)。
因此,我可以使用XML配置和AOP配置事务行为。
阅读我知道我可以这样做的文档:
下面的例子说明了如何做到这一点:
<aop:config>
<aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>
<tx:advice id=“txAdvice”>
<tx:attributes>
<tx:method name="get*" read-only="true" timeout="10"/>
<tx:method name="find*" read-only="true" timeout="10"/>
<tx:method name="*" timeout="30"/>
</tx:attributes>
</tx:advice>
<bean id=“transactionManager”
class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=“dataSource” ref=“dataSource”/>
</bean>好的,但是现在我有一些问题要理解前面的XML配置到底是怎么做的。
我认为第一节代表了我想建议的声明,
<aop:config>
<aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>因此,在本例中,我声明了一个与rewards.RewardNetwork中所有接受任何参数并返回任何类型对象的方法相关的切入点。
这意味着我想在所有这些方法中添加事务行为?不然呢?
这个标签的第二行到底是什么意思?,这一行:
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>然后,在第二节中,在我看来,它指定了由前一个切入点表达式选择的metodse的子集,并且为这些方法启用了事务行为:
<tx:advice id=“txAdvice”>
<tx:attributes>
<tx:method name="get*" read-only="true" timeout="10"/>
<tx:method name="find*" read-only="true" timeout="10"/>
<tx:method name="*" timeout="30"/>
</tx:attributes>
</tx:advice>在这种情况下,我认为使用tx命名空间可以为以下方面提供事务通知的简明定义:
在我看来,它首先使用AOP来选择切入点来选择我想要在其上启用事务行为的目标类和方法,然后使用tx标记来选择一个特定方法的子集来进行现实事务处理。
如果是这样的话,为什么存在这个双重步骤来选择methos并使其具有事务性呢?
这是对的还是我遗漏了什么?你能确切地解释一下这种配置的逻辑吗?
发布于 2014-12-26 12:54:04
<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>这一行意味着对于定义的切入点
<aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>将执行名为txAdvise的建议。第二部分
<tx:advice id=“txAdvice”>
<tx:attributes>
<tx:method name="get*" read-only="true" timeout="10"/>
<tx:method name="find*" read-only="true" timeout="10"/>
<tx:method name="*" timeout="30"/>
</tx:attributes>
是tAdvice通知的具体定义。首先,很明显,建议是事务性行为定义。txAdvice中的*表示get*与find*行不匹配的所有内容都得到*定义。
这种配置允许--但不是强制--允许某些复制,这是正确的。根据我的理解,这是因为AOP名称空间的第一部分是通用的spring,需要说明哪些Java功能需要aop编辑(默认情况下是代理)。第二部分将具体的AOP代理定义为tx代理,并允许对tx行为进行微调。您不能将其放入AOP部分,因为aop名称空间是通用的AOP,对事务一无所知。另一方面,在给定的建议下,对tx行为进行微调是非常有用的。通常,您会为一个包中的所有服务声明切入点,然后为给定的方法命名模式声明通用的tx建议(就像在您的示例中一样)。这样,基于注释的定义就不可能得到非常统一和通用的tx定义。
https://stackoverflow.com/questions/27657013
复制相似问题