私は春と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
され、では処理されmethodA()
ません。したがって、コードは適切なトランザクションで実行され、コミットされます。AspectJモードを使用すると、オンもチェックされ、例外がスローされます。@Transactional(propagation=Propagation.NEVER)
methodB()
@Transactional(propagation=Propagation.NEVER)
methodB()
さて、私の質問は、なぜこの制限がSpringによって課されるのかということです。春のデザインには2つの可能性があります。
公開されているのに、methodB()でアノテーションをチェックできないのはSpringの技術的な制限ですか?しかし、AspectJがそれをチェックできるのなら、なぜSpringではないのでしょうか。
意図的に、内部メソッド呼び出しのこのAOPチェックを制限しています。この種のメソッド呼び出し(ターゲットメソッドに異なるtransactionPropagationで注釈が付けられている場合)は、適切な設計方法に反していますか?