在编写一个异步任务时出现报错:“The bean 'asyncShenCe' could not be injected as a 'com.sinochem.api.service.impl.AsyncShenCeImpl' because it is a JDK dynamic proxy that implements:
com.sinochem.api.service.IAsyncShenCe”
![](https://img1.php1.cn/3cdc5/343b/a6e/073cbc27b60adee8.png)
其原因是因为异步任务@Async注解的底层都是通过动态代理实现的,而动态代理是面向接口的。
因此直接把加了@Async的异步方法的实现类进行bean注入是会报错的。
@Autowired
private AsyncShenCeImpl asyncShenCe; //这样子写是会报错的
这是因为jdk动态代理会隐藏原生类AsyncShenCeImpl,让接口代理其接口实现类的功能。因此既然AsyncShenCeImpl类被隐藏了,那么在编译的时候自然会注入失败报错了。
所以应该直接注入接口
@Autowired
private IAsyncShenCe asyncShenCe;
接口&接口实现类
package com.sinochem.api.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
@Component
public interface IAsyncShenCe {
/**
* @Author: Wu Linchun
* @Date: 2021-06-15 14:05
* @Parameters:
* @Return:
* @Throws:
* @Description: 异步任务,把需要查询的数据同步到神策
**/
public void sysShenCe(Map map, String authorizeUrl) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException;
}
package com.sinochem.api.service.impl;
略
@Slf4j
@Service("asyncShenCe")
public class AsyncShenCeImpl implements IAsyncShenCe {
略
@Override
@Async
public void sysShenCe(Map map, String authorizeUrl) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
略
}
}
参考资料
- because it is a JDK dynamic proxy that implement - 简书 (jianshu.com)
- Java中的引用和动态代理的实现详解_java_脚本之家 (jb51.net)
- 浅谈@Async和@Transaction - 小闹的ignore - 博客园 (cnblogs.com)