2
<prop key="load*">PROPAGATION_REQUIRED, readOnly</prop>

ここで、key="load*" はワイルドカード "*" を使用しています。load で始まるすべての関数に一致しますよね? 私の質問はそれです。すべての関数に配置せずに、注釈ベースの構成を使用してこれを実装するにはどうすればよいですか?

@Transactional(readOnly = true, propagation= Propagation.REQUIRED)

名前が「load」で始まるすべての関数の上にこれを配置せずにこれを行うことができる方法はありますか?

乾杯

4

1 に答える 1

1

この目的のためにアスペクトを使用できます。つまり、「load*」という名前のすべてのメソッドをインターセプトし、トランザクションが確実に開始されるようにするアスペクトを定義します。ただし、私の意見では、このようなアプローチはコードの単体テスト、理解、保守を難しくするため、悪いものです。実際、@Transactional の処理はアスペクトを使用して行われますが、なぜこれに別の抽象化レイヤーを追加する必要があるのでしょうか? この注釈を使用すると、誰かがコードを見て、メソッドがトランザクションで実行されている/実行されている必要があることがすぐにわかります。これを隠すと、他の人の生活が難しくなります。

それでも実装したい場合は、ここに小さな例があります。私はこれをまったくテストしていないことに注意してください。単なるアイデアのデモンストレーションです。

@Aspect
public class MyInterceptor
{
   @Around("execution(* load*(..))")
   @Transactional
   public Object makeMeTransactional(ProceedingJoinPoint pjp)
   {
      return pjp.proceed();
   }
}
于 2013-10-22T09:34:59.417 に答える