java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot使用quartz,注入feignClient,client为null

SpringBoot使用quartz,注入feignClient,client为null问题

作者:So Young_

在SpringBoot中使用Quartz和FeignClient时,如果通过@Autowired或构造方法注入FeignClient导致为null,可以使用Spring提供的通过文件名获取bean的方式解决,这种方法在Quartz启动时通过反射注入类,而类还未初始化好,导致FeignClient为null的问题

SpringBoot使用quartz,注入feignClient,client为null

使用@autowired,活着构造方法注入,打断点查看注入的feigncliet为null, 搜索网上的一些博客,大致原因是因为quartz启动是通过反射将一些类注入进来,启动的时候引用这个类还没初始化好,下面是解决方案:

使用spring提供的通过文件名获取bean的方式

注入进来

@Component
public class SpringUtil implements ApplicationContextAware {
 
    private static ApplicationContext applicationContext;
 
    @Override
    public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }
 
    // 通过name获取 Bean.
    @NotNull
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }
 
    // 通过class获取Bean.
    @NotNull
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
 
    // 通过name,以及Clazz返回指定的Bean
    @NotNull
    public static <T> T getBean(String name, Class<T> clazz) {
        return applicationContext.getBean(name, clazz);
    }
}

使用的时候通过类名加载类

正常使用即可

CommunicationClient communicationClient = SpringUtil.getBean(CommunicationClient.class);
 
// 正常调用方法
communicationClient.getFunction();
 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文