@transactionalの引数がクラスレベルで適用されている場合は、それを取得します。
たとえば、次の@transactional
ようなメソッドレベルで適用した場合:
class A {
@transactional(readOnly= true)
public void someMethod(){
// some code...
}
}
次に、次のようなコードを使用して、正式な引数、つまりreadOnlyをインターセプトしてキャプチャできます。
@Aspect
@Component
@Order(0)
public class ReadOnlyRouteInterceptor {
private static final Logger logger = LoggerFactory.getLogger(ReadOnlyRouteInterceptor.class);
@Around("@annotation(transactional)")
public Object proceed(ProceedingJoinPoint proceedingJoinPoint, Transactional transactional) {
if (transactional.readOnly())
//do something
}
ただし、上記のコードは@transactional
、クラスレベルで次のように適用すると機能しません。
@transactional(readOnly= true)
class A {
public void someMethod(){
// some code...
}
}
ここで@transactional
、クラスレベルで適用される注釈をインターセプトするために、次のコードがあります。
@Pointcut("@within(org.springframework.transaction.annotation.Transactional *)")
public void beanAnnotatedWithTransactional() {}
@Pointcut("execution(public * *(..))")
public void publicMethod() {}
@Pointcut("publicMethod() && beanAnnotatedWithTransactional()")
public void publicMethodInsideAClassMarkedWithATransactional() {}
ここでの実際の問題@transactional
は、クラスレベルで適用されている場合、readOnlyフラグの値を確認できないことです。
タイプレベルの注釈の場合:
@Around("@within(transactional)")
public Object myMethod(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
boolean readOnly = transactional.readOnly();
...
return pjp.proceed();
}
メソッドレベルのアノテーションの場合:
@Around("execution(public * *(..)) && @annotation(org.springframework.transaction.annotation.Transactional)")
public Object myMethod(ProceedingJoinPoint pjp) throws Throwable {
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
Transactional annotation = method.getAnnotation(org.springframework.transaction.annotation.Transactional.class);
boolean value = annotation. readOnly();
...
return pjp.proceed();
}
メソッドレベルの別の(よりクリーンな)オプション:
@Around("@annotation(transactional)")
public Object myMethod(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
}
または
タガーをより詳細に制御する場合:
@Around("execution(@org.springframework.transaction.annotation.Transactional public * *(..)) && @annotation("transactional")
public Object myMethod(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加