在编写一个异步任务时出现报错:“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”
其原因是因为异步任务@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<String, Object> 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<String, Object> map, String authorizeUrl) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
略
}
}
参考资料