8

Webアプリで3つの異なるトランザクションマネージャーを使用する必要があります。そこで、 Springリファレンス(セクション10.5.6.3カスタムショートカットアノテーション)に従って独自のアノテーションを作成しました。

1つのアノテーション(1つの特定のtransactionmanagerを使用するため)は次のようになります。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.transaction.annotation.Transactional;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("customer")
public @interface CustomerTX{


}

カスタマイズされた@CustomerTXアノテーションでサービスレイヤーにアノテーションを付けると、すべてが正常に機能します。ただし、readonly = true、rollbackFor =など、アノテーションにさらに多くのオプションを提供する必要があります。アノテーションを「拡張」することはできないので(私は本当にSpringから@Transactionalアノテーションを拡張する必要があります)、これの正しい実装は何ですか?

4

2 に答える 2

5

春4にあなたはそれをすることができます。ドキュメントに記載されているように

メタ注釈を組み合わせて、合成注釈を作成することもできます。たとえば、Spring MVCの@RestControllerアノテーションは、@Controllerと@ResponseBodyで構成されています。

さらに、構成された注釈は、オプションでメタ注釈から属性を再宣言して、ユーザーのカスタマイズを可能にする場合があります。これは、メタアノテーションの属性のサブセットのみを公開する場合に特に役立ちます。たとえば、Springの@SessionScopeアノテーションは、スコープ名をセッションにハードコードしますが、proxyModeのカスタマイズを可能にします。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {

    /**
     * Alias for {@link Scope#proxyMode}.
     * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
     */
    @AliasFor(annotation = Scope.class)
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;

}
于 2018-03-05T08:31:56.107 に答える
4

いくつかのカスタムアノテーションを作成する必要があります。恐れ入りますが、ユースケースごとに1つずつ、必要な正確な@Transactionalアノテーションをそれぞれにアノテーションします。

または、独自のトランザクションロジックを作成するには、AspectJ(org.springframework.transaction.aspectj.AbstractTransactionAspectspring-aspects.jarから拡張)で独自のアスペクトを作成する必要があります。


更新:これは当時の正解でしたが、Spring 4以降では、CLSによる回答が優先されるはずです。

于 2010-08-31T09:45:41.387 に答える