class MethodLoggingAdvice {

    @Around("operationsMethods()")
    public Object logMethodBeingInvoked(ProceedingJoinPoint pjp) throws Throwable
    {
        // Get the target class being called.
        Class<?> targetClass = pjp.getTarget().getClass();

        // Get the target method being called.
        MethodSignature targetMethodSignature = (MethodSignature) pjp.getSignature();
        Method targetMethod = targetMethodSignature.getMethod();
        if (targetMethod.getDeclaringClass().isInterface())
        {
            // Get the underlying implementation if we are given an interface.
            targetMethod = pjp.getTarget().getClass().getMethod(pjp.getSignature().getName(), targetMethod.getParameterTypes());
        }

        // Only log the method if the class and method aren't suppressing logging and the log level is debug.
        if ((AnnotationUtils.findAnnotation(targetClass, SuppressLogging.class) == null) &&
            (AnnotationUtils.findAnnotation(targetMethod, SuppressLogging.class) == null) && (LOGGER.isDebugEnabled()))
        {
            LOGGER.debug("javaMethod=\"{}.{}\"", targetClass.getName(), targetMethodSignature.getName());
        }

        // Proceed to the join point (i.e. call the method and let it return).
        return pjp.proceed();
    }

}