应用程序无法以@Async批注开始

时间:2018-06-10 20:52:47

标签: java spring spring-boot asynchronous

我正在尝试异步运行背景中的函数。为此,我尝试使用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的代理。

请帮助我启动并运行此应用程序。

2 个答案:

答案 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