spring新規によって作成されたオブジェクトを使用したトランザクションを開始します
-
11-10-2019 - |
質問
注釈付きの方法を備えたPojoクラスがあります @Transactional
public class Pojo {
@Transactional
public void doInTransaction() {
...
}
}
春の宣言的トランザクション管理はAOPに基づいていますが、それに関する経験はありません。私の質問は次のとおりです。 (new Pojo).doInTransaction()
単独で、春はトランザクションを開始します。
解決
春の宣言的トランザクション管理はAPOに基づいていますが、それについての経験はありません。
私はそれで働き始めることをお勧めします、そして、あなたはAOPを使用してトランザクションアドバイスを使用した経験を得るでしょう。良い出発点はです ここ.
(新しいpojo).dointransaction()のみを呼び出すと、Springがトランザクションを開始する可能性があります。
いいえ、あなたが手動で呼び出した豆を知っていることを春に期待することはできません。ただし、宣言的なトランザクション管理を避け、プログラム的なトランザクション管理を行いたいと思っているようです。スプリングでそれを行う方法があります トランザクションテンプレート. 。それはあなたが探していたものですか?
他のヒント
それはやや可能ですが、面倒な方法で:あなたは AutowireCapableBeanFactory
機構。
例としてのトランザクションクラスは次のとおりです
public interface FooBar{
void fooIze(Object foo);
}
public class FooBarImpl implements FooBar{
@Transactional
@Override
public void fooIze(final Object foo){
// do stuff here
}
}
そして、ここに私たちがそれを使用する方法があります:
public class FooService implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(
final ApplicationContext applicationContext){
this.applicationContext = applicationContext;
}
public void serviceMethod(){
//declare variable as interface, initialize to implementation
FooBar fooBar = new FooBarImpl();
// try to use it, won't work, as it's not a proxy yet
Object target = new Object[0];
fooBar.fooIze(target); // no transaction
// now let spring create the proxy and re-assign the variable
// to the proxy:
fooBar = // this is no longer an instance of FooBarImpl!!!
(FooBar) applicationContext
.getAutowireCapableBeanFactory()
.applyBeanPostProcessorsAfterInitialization(fooBar,
"someBeanName");
fooBar.fooIze(fooBar); // this time it should work
}
}
これはベストプラクティスではありません。一つには、アプリケーションがSpringフレームワークを強く認識し、依存関係の注入原則に違反します。そのため、他の方法がない場合にのみこれを使用してください!
はい、それ は 可能。春はそうです いいえ 動的プロキシの使用が必要です @Transactional
働くために。代わりに、AspectJが提供する「True AOP」を使用できます。
詳細については、参照してください http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-aspectj
スプリングが注釈を介したトランザクションを処理する方法は、あなたが言ったようにAOPを使用しています。 AOPビットは動的プロキシを使用して実装されます(参照 doc)
そのためには、スプリングコンテナを介してクラスのインスタンス(POJO)を取得する必要があります。スプリングは、注釈付きの方法を自動的に囲むPojoのダイナミックプロキシを返します。トランザクション管理コード。
単に行う場合
Pojo p = new Pojo();
p.doInTransaction();
Springにはここでの役割はありません。メソッドコールはトランザクション内にありません。
だからあなたがする必要があるのはこのようなことです
ApplicationContext springContext = ...;
Pojo p = (Pojo) springContext.getBean("your.pojo.id");
p.doInTransaction();
注:これは例です。コンテキストから手動で豆を取得するのではなく、依存関係の注入を好むはずです
そうすることで、適切に構成されたスプリングコンテキストを使用して、春にはトランザクションアノテーションをスキャンするためにクラスを探して、豆を自動的に注釈に巻き付けてダイナミックプロキシインスタンスを自動的に包みました。何も変わらないあなたの観点からは、あなたはあなた自身のクラスにあなたのオブジェクトをキャストすることになりますが、あなたがあなたのスプリングコンテキストPojo Beanのクラス名を印刷しようとする場合、あなたはプロキシ$として何かを得るでしょう。 ..元のクラス名ではありません。
とにかくこのリンクを見てください: テキストをリンクします