我已经通过 spring 和 AspectJ 浏览了许多关于 tx 的帖子。下面是总结,说,我有一个服务类和它的接口
interface TestService {
void methodA();
void methodB();
}
class TestServiceImpl implements TesService {
@Transactional
void methodA() {
methodB();
}
@Transactional(propagation=Propagation.NEVER)
void methodB(){}
}
还有我的配置
<tx:annotation-driven transaction-manager="jpaTxManager"/>
<bean id="jpaTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"><ref bean="entityManagerFactory"/></property>
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
<bean id="testService" class="com.motherframework.plugin.test.service.TestServiceImpl">
<property name="testDAO" ref="testDAO"/>
</bean>
我是testService.methodA()
从某个客户班打来的。按照spring的JDK动态代理使用,只会关心@Transactional
on methodA()
,不关心@Transactional(propagation=Propagation.NEVER)
on methodB()
。因此代码通过正确的事务和提交执行。如果我们使用 AspectJ 模式,那么它也会检查@Transactional(propagation=Propagation.NEVER)
onmethodB()
并抛出异常。
现在我的问题是,为什么这个限制是由 Spring 强加的?现在Spring设计有两种可能,
Spring 的技术限制是他们无法检查 methodB() 中的注释,尽管它是公开的?但是如果 AspectJ 可以检查它,那为什么不是 Spring 呢?
他们有意限制了这种 AOP 检查内部方法调用。这种方法调用(目标方法用不同的 transactionPropagation 注释)是否违反了正确的设计方法?