编写异步任务@Async出现bean无法注入的问题解决方案

在编写一个异步任务时出现报错:“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出现bean无法注入的问题解决方案_第1张图片

其原因是因为异步任务@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)

你可能感兴趣的:(后端,java基础知识,工作,java,proxy,bean)