Spring runs the method on a separate executor via a proxy. A common gotcha is self-invocation (calling the method from the same class) which bypasses the proxy, so it won’t run async. Also remember to size the executor.