为何Spring Boot中@Async在同类方法调用时无法实现异步?
为什么@Async在同一类内调用不生效,移到其他类就正常?
核心原因是Spring的@Async依赖动态代理实现异步逻辑,只有通过代理对象调用方法时,异步切面才会被触发。
同一类内调用场景:
当DemoController的test()方法直接调用本类的calculate()时,本质是通过this(原始类实例)调用方法,而非Spring生成的代理对象。这种情况下,Spring的AOP切面无法拦截该调用,@Async的异步逻辑不会执行,方法只能同步运行。移至UtilService后的场景:
把calculate()放到UtilService后,test()方法是通过Spring注入的UtilService代理对象调用方法。此时Spring的AOP切面会拦截这个调用,自动将方法任务提交到配置的异步线程池,异步功能也就正常生效了。
如果不想把方法移到其他类,也可以通过注入自身代理对象、或从ApplicationContext中获取代理对象的方式来触发异步逻辑,但这种写法并不推荐,最好还是遵循Spring的代理设计规范,将异步方法放到独立的Bean中。
内容的提问来源于stack exchange,提问作者Satya
相关产品推荐
相关产品推荐

