我正在尝试异步运行背景中的函数。为此,我尝试使用Spring的@Async注释,但在将此注释放在函数上后,我的应用程序无法启动。
我试过
@EnableAsync(proxyTargetClass = true)
但仍然没有运气。
以下是我在申请开始时收到的消息。
申请失败
说明
bean'MyBatchSyncProcessor'无法作为'com.a.b.c.service.MyBatchSyncProcessor'注入,因为它是一个JDK动态代理,它实现了: com.a.b.c.service.BaseSyncProcessor
动作:
考虑通过在@EnableAsync和/或@EnableCaching上设置proxyTargetClass = true来将bean注入其接口之一或强制使用基于CGLib的代理。
请帮助我启动并运行此应用程序。
答案 0 :(得分:1)
不要注入您的服务实现(MyBatchSyncProcessor
)-注入其接口BaseSyncProcessor
。
答案 1 :(得分:0)
虽然第一个答案是正确的,但它并没有真正涉及为什么:
来自https://www.fatalerrors.org/a/0dx20j8.html:
<块引用>Async 使用 Spring 的 ImportSelector 方法向 Spring 注册一个 Configuration 配置类,并注入一个 BeanPostProcessor,它在 bean 实例化后调用 postProcessAfterInitialization 方法为对象生成动态代理(如果目标类实现一个接口,默认使用JDK代理,否则使用CGLib)
当你把它和:
(https://www.tutorialspoint.com/difference-between-jdk-dynamic-proxy-and-cglib-proxy-in-spring)
<块引用>JDK 动态代理可用于 JDK。它只能通过接口代理,因此目标类需要实现接口。在您实现一个或多个接口时,spring 将自动使用 JDK 动态代理。
现在很明显,一旦您添加了 @EnableAsync
方面,
您需要在使用 BaseSyncProcessor
注释的 bean 中注入接口 MyBatchSyncProcessor
而不是其实现 @Async
。