6

クラスはコンパイル時のウィービングを使用します。

アスペクトクラスがあると想像してください:

@Aspect
public class SecurityInterceptor {

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void beanAnnotatedWithController() {}

    @Pointcut("execution(public * *(..)) && args(*,httpReq)")
    public void publicMethods(HttpServletRequest httpReq) {}

    @Pointcut("beanAnnotatedWithController() && publicMethods(httpReq)")
    public void controllerMethods(HttpServletRequest httpReq) {}

    @Pointcut("execution(public * *(..)) && args(httpReq)")
    public void publicMethodsRequestOnly(HttpServletRequest httpReq) {}

    @Pointcut("beanAnnotatedWithController() && publicMethodsRequestOnly(httpReq)")
    public void controllerMethodsOneArg(HttpServletRequest httpReq) {}


    @Around(value = "controllerMethods(httpReq)")
    public Object populateSecurityContext(final ProceedingJoinPoint joinPoint, HttpServletRequest httpReq) throws Throwable {
        return popSecContext(joinPoint, httpReq);
    }

    @Around(value = "controllerMethodsOneArg(httpReq)")
    public Object populateSecurityContextOneArg(final ProceedingJoinPoint joinPoint, HttpServletRequest httpReq) throws Throwable {
        return popSecContext(joinPoint, httpReq);
    }

}

@DeclarePrecedence実行順序を決定するために使用する正しい方法は何ですか?

4

3 に答える 3

7

AspectJドキュメントの言語セマンティクスセクションの「アドバイスの優先順位」の段落をお読みください。

アスペクトの優先順位は明示的に宣言できます。単一のアスペクト内のアドバイスの優先順位は、ドキュメントに記載されているルールによって決定され、変更することはできません、AFAIK。したがって@DeclarePrecedence、この場合は役に立ちません。アスペクトファイル内のアドバイスの順序を変更するだけです。

于 2012-08-31T17:04:00.353 に答える
7

複数のアスペクトの順序を探している場合は、次のようなアスペクトを作成できます。

@Aspect
@DeclarePrecedence("AuthorizationAspect, MySpecialAspect, LastAspect")
public class CoordinationAspect {
    // empty
}

これは確かに複数の側面で機能します。単一の側面の内部は別の問題であり、AFAIK を変更することはできませんが、なぜこれが問題になるのかわかりません。

于 2014-09-07T12:33:43.343 に答える