code: public static MethodInvoker getMethodInvokerByAnnotation(
  			final Class<? extends Annotation> annotationType, final Object target) {
  		Assert.notNull(target, "Target must not be null");
  		Assert.notNull(annotationType, "AnnotationType must not be null");
  		Assert.isTrue(ObjectUtils.containsElement(
  				annotationType.getAnnotation(Target.class).value(), ElementType.METHOD),
  				"Annotation [" + annotationType + "] is not a Method-level annotation.");
  		final Class<?> targetClass = (target instanceof Advised)
  				? ((Advised) target).getTargetSource().getTargetClass()
  				: target.getClass();
  		if (targetClass == null) {
  			// Proxy with no target cannot have annotations
  			return null;
  		}
  		final AtomicReference<Method> annotatedMethod = new AtomicReference<Method>();
  		ReflectionUtils.doWithMethods(targetClass, new ReflectionUtils.MethodCallback() {
  			public void doWith(Method method)
  					throws IllegalArgumentException, IllegalAccessException {
  				Annotation annotation = AnnotationUtils.findAnnotation(method,
  						annotationType);
  				if (annotation != null) {
  					Assert.isNull(annotatedMethod.get(),
  							"found more than one method on target class ["
  									+ targetClass.getSimpleName()
  									+ "] with the annotation type ["
  									+ annotationType.getSimpleName() + "].");
  					annotatedMethod.set(method);
  				}
  			}
  		});
  		Method method = annotatedMethod.get();
  		if (method == null) {
  			return null;
  		}
  		else {
  			return new SimpleMethodInvoker(target, annotatedMethod.get());
  		}
  	}
docs: Create {@link MethodInvoker} for the method with the provided annotation on the
  provided object. Annotations that cannot be applied to methods (i.e. that aren't
  annotated with an element type of METHOD) will cause an exception to be thrown.
  @param annotationType to be searched for
  @param target to be invoked
  @return MethodInvoker for the provided annotation, null if none is found.