code: private void assertTargetBean(Method method, Object targetBean, Object[] args) {
  		Class<?> methodDeclaringClass = method.getDeclaringClass();
  		Class<?> targetBeanClass = targetBean.getClass();
  		if (!methodDeclaringClass.isAssignableFrom(targetBeanClass)) {
  			String msg = "The mapped controller method class '"
  					+ methodDeclaringClass.getName()
  					+ "' is not an instance of the actual controller bean instance '"
  					+ targetBeanClass.getName()
  					+ "'. If the controller requires proxying "
  					+ "(e.g. due to @Transactional), please use class-based proxying.";
  			throw new IllegalStateException(getInvocationErrorMessage(msg, args));
  		}
  	}
docs: Assert that the target bean class is an instance of the class where the given
  method is declared. In some cases the actual controller instance at request-
  processing time may be a JDK dynamic proxy (lazy initialization, prototype beans,
  and others). {@code @Controller}'s that require proxying should prefer class-based
  proxy mechanisms.