Search in sources :

Example 1 with ProxyMethodInvocation

use of org.springframework.aop.ProxyMethodInvocation in project spring-framework by spring-projects.

the class ExposeBeanNameAdvisors method getBeanName.

/**
	 * Find the bean name for the given invocation. Assumes that an ExposeBeanNameAdvisor
	 * has been included in the interceptor chain.
	 * @param mi MethodInvocation that should contain the bean name as an attribute
	 * @return the bean name (never {@code null})
	 * @throws IllegalStateException if the bean name has not been exposed
	 */
public static String getBeanName(MethodInvocation mi) throws IllegalStateException {
    if (!(mi instanceof ProxyMethodInvocation)) {
        throw new IllegalArgumentException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
    }
    ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;
    String beanName = (String) pmi.getUserAttribute(BEAN_NAME_ATTRIBUTE);
    if (beanName == null) {
        throw new IllegalStateException("Cannot get bean name; not set on MethodInvocation: " + mi);
    }
    return beanName;
}
Also used : ProxyMethodInvocation(org.springframework.aop.ProxyMethodInvocation)

Example 2 with ProxyMethodInvocation

use of org.springframework.aop.ProxyMethodInvocation in project spring-framework by spring-projects.

the class AbstractAspectJAdvice method currentJoinPoint.

/**
	 * Lazily instantiate joinpoint for the current invocation.
	 * Requires MethodInvocation to be bound with ExposeInvocationInterceptor.
	 * <p>Do not use if access is available to the current ReflectiveMethodInvocation
	 * (in an around advice).
	 * @return current AspectJ joinpoint, or through an exception if we're not in a
	 * Spring AOP invocation.
	 */
public static JoinPoint currentJoinPoint() {
    MethodInvocation mi = ExposeInvocationInterceptor.currentInvocation();
    if (!(mi instanceof ProxyMethodInvocation)) {
        throw new IllegalStateException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
    }
    ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;
    JoinPoint jp = (JoinPoint) pmi.getUserAttribute(JOIN_POINT_KEY);
    if (jp == null) {
        jp = new MethodInvocationProceedingJoinPoint(pmi);
        pmi.setUserAttribute(JOIN_POINT_KEY, jp);
    }
    return jp;
}
Also used : ProxyMethodInvocation(org.springframework.aop.ProxyMethodInvocation) MethodInvocation(org.aopalliance.intercept.MethodInvocation) ProxyMethodInvocation(org.springframework.aop.ProxyMethodInvocation) JoinPoint(org.aspectj.lang.JoinPoint) ProceedingJoinPoint(org.aspectj.lang.ProceedingJoinPoint)

Example 3 with ProxyMethodInvocation

use of org.springframework.aop.ProxyMethodInvocation in project spring-framework by spring-projects.

the class AspectJAroundAdvice method invoke.

@Override
public Object invoke(MethodInvocation mi) throws Throwable {
    if (!(mi instanceof ProxyMethodInvocation)) {
        throw new IllegalStateException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
    }
    ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;
    ProceedingJoinPoint pjp = lazyGetProceedingJoinPoint(pmi);
    JoinPointMatch jpm = getJoinPointMatch(pmi);
    return invokeAdviceMethod(pjp, jpm, null, null);
}
Also used : ProxyMethodInvocation(org.springframework.aop.ProxyMethodInvocation) JoinPointMatch(org.aspectj.weaver.tools.JoinPointMatch) ProceedingJoinPoint(org.aspectj.lang.ProceedingJoinPoint)

Example 4 with ProxyMethodInvocation

use of org.springframework.aop.ProxyMethodInvocation in project spring-framework by spring-projects.

the class AspectJExpressionPointcut method matches.

@Override
public boolean matches(Method method, Class<?> targetClass, Object... args) {
    checkReadyToMatch();
    ShadowMatch shadowMatch = getShadowMatch(AopUtils.getMostSpecificMethod(method, targetClass), method);
    ShadowMatch originalShadowMatch = getShadowMatch(method, method);
    // Bind Spring AOP proxy to AspectJ "this" and Spring AOP target to AspectJ target,
    // consistent with return of MethodInvocationProceedingJoinPoint
    ProxyMethodInvocation pmi = null;
    Object targetObject = null;
    Object thisObject = null;
    try {
        MethodInvocation mi = ExposeInvocationInterceptor.currentInvocation();
        targetObject = mi.getThis();
        if (!(mi instanceof ProxyMethodInvocation)) {
            throw new IllegalStateException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
        }
        pmi = (ProxyMethodInvocation) mi;
        thisObject = pmi.getProxy();
    } catch (IllegalStateException ex) {
        // No current invocation...
        if (logger.isDebugEnabled()) {
            logger.debug("Could not access current invocation - matching with limited context: " + ex);
        }
    }
    try {
        JoinPointMatch joinPointMatch = shadowMatch.matchesJoinPoint(thisObject, targetObject, args);
        /*
			 * Do a final check to see if any this(TYPE) kind of residue match. For
			 * this purpose, we use the original method's (proxy method's) shadow to
			 * ensure that 'this' is correctly checked against. Without this check,
			 * we get incorrect match on this(TYPE) where TYPE matches the target
			 * type but not 'this' (as would be the case of JDK dynamic proxies).
			 * <p>See SPR-2979 for the original bug.
			 */
        if (pmi != null) {
            // there is a current invocation
            RuntimeTestWalker originalMethodResidueTest = getRuntimeTestWalker(originalShadowMatch);
            if (!originalMethodResidueTest.testThisInstanceOfResidue(thisObject.getClass())) {
                return false;
            }
            if (joinPointMatch.matches()) {
                bindParameters(pmi, joinPointMatch);
            }
        }
        return joinPointMatch.matches();
    } catch (Throwable ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Failed to evaluate join point for arguments " + Arrays.asList(args) + " - falling back to non-match", ex);
        }
        return false;
    }
}
Also used : ProxyMethodInvocation(org.springframework.aop.ProxyMethodInvocation) MethodInvocation(org.aopalliance.intercept.MethodInvocation) ProxyMethodInvocation(org.springframework.aop.ProxyMethodInvocation) ShadowMatch(org.aspectj.weaver.tools.ShadowMatch) JoinPointMatch(org.aspectj.weaver.tools.JoinPointMatch)

Aggregations

ProxyMethodInvocation (org.springframework.aop.ProxyMethodInvocation)4 MethodInvocation (org.aopalliance.intercept.MethodInvocation)2 ProceedingJoinPoint (org.aspectj.lang.ProceedingJoinPoint)2 JoinPointMatch (org.aspectj.weaver.tools.JoinPointMatch)2 JoinPoint (org.aspectj.lang.JoinPoint)1 ShadowMatch (org.aspectj.weaver.tools.ShadowMatch)1