1. ホーム

[解決済み】Springの@Transactional属性はprivateメソッドで機能するか?

2022-04-05 09:11:46

質問

もし トランザクショナル -アノテーションは何らかの効果を持つのでしょうか?

もし @Transactional アノテーションが public メソッドにある場合、それが動作してトランザクションが開かれます。

public class Bean {
  public void doStuff() {
     doPrivateStuff();
  }
  @Transactional
  private void doPrivateStuff() {

  }
}

...

Bean bean = (Bean)appContext.getBean("bean");
bean.doStuff();

解決方法は?

問題は、プライベートかパブリックかではなく、どのように呼び出すか、どのAOP実装を使用するかです。

もし(デフォルトの)Spring Proxy AOPを使用する場合、Springが提供するすべてのAOP機能(例えば @Transactional は、プロキシを経由して呼び出された場合のみ、考慮されます。-- これは通常、アノテーションされたメソッドが 別の ビーンになります。

これには2つの意味がある。

  • プライベートメソッドは他のBeanから呼び出してはならないので(例外はリフレクション)、その @Transactional アノテーションは考慮されません。
  • メソッドがpublicであっても、同じBeanから呼び出された場合は、それも考慮されません(この記述は、(デフォルトの)Spring Proxy AOPが使用されている場合のみ正しいです)。

参照 Springリファレンス。第9.6章 9.6 プロキシの仕組み

IMHOでは、Spring Proxiesの代わりにaspectJ modeを使用することで、この問題を克服することができます。そして、AspectJのTransactional Aspectsは、プライベートメソッドにも織り込まれています(Spring 3.0で確認済み)。