SpringBoot 定时任务依赖注入失败记录

前言

日志系统需要每天推送每天日志统计到钉钉群,至于如何实现向钉钉推送请参考:java(SpringBoot)实现钉钉推送。学长他们的用的是一个固定的Webhooksecrect,这样就会导致一个问题,下次修改推送群那么就需要修改源代码,于是乎我加了一个钉钉数据表,这样就可以做到随意更改推送群了。

实现过程:

添加钉钉实体:

主要字断:webhooksecrect

/**
 * 钉钉
 * @author hzl 
 */
@Entity
public class Ding {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonView(base.class)
    private Long id;

    private String webHook = "";

    private String secret = "";

    public Long getId() {
        return id;
    }

    public String getWebHook() {
        return webHook;
    }

    public void setWebHook(String webHook) {
        this.webHook = webHook;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }

    public interface base {}
}

添加仓库

/**
 * 钉钉
 */
@Repository("DingRepository")
public interface DingRepository extends CrudRepository<Ding, Long> {
}

运行结果:

dingRepository为空?可是我用@Autowired自动注入了啊😳
image.png

image.png

排查过程:

image.png

结果:

初始化文件中DingRepository正常

初步猜想:定时任务影响依赖注入。

验证猜想:定时任务影响依赖注入

经过搜索发现猜想正确!
@Scheduled执行优先级大于@Autowired,因此不要期待SpringBoot给我们实现依赖注入了。

解决办法

ApplicationContextAware

介绍:在项目初始化的时候,会去寻找他的实现类,同时通过setApplicationContext方法将上下文(ApplicationContext)注入进来,当我们需要的时候便可以根据其封装好的方法获取自己想要的东西。同样他也继承了BeanFactory,我们可以根据BeanFactorygetBean获取自己想要的Bean

image.png

实例化ApplicationContextAware,给出如下参考:

@Component
public class ApplicationContextUtil implements ApplicationContextAware {

  private static ApplicationContext applicationContext;

  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }


  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    ApplicationContextUtil.applicationContext = applicationContext;
  }


  public static Object getBean(String beanName) {
    return applicationContext.getBean(beanName);
  }
}

至此我的疑问解除,通过查询得知其实也有很多地方无法直接使用Dao层等,如:Utils,这个时候ApplicationContextAware真的可以帮我们大忙。

167 声望
15 粉丝
0 条评论
推荐阅读
Springboot实现文件上传和下载
在一些文件存储量很小的工程中,有一些上传文件放置在工程本身的目录下,但是随着文件上传的量越来越大,工程本身所在的文件夹容量会越来越大,不仅打包和部署的效率会降低,工程的启动和运行也会变慢,所以一般...

郝泽龙_HZ2阅读 889

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 27.6k评论 1

一文彻底搞懂加密、数字签名和数字证书!
微信搜索🔍「编程指北」,关注这个写干货的程序员,回复「资源」,即可获取后台开发学习路线和书籍来源:个人CS学习网站:[链接]前言这本是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视...

编程指北71阅读 33.8k评论 20

Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 19.4k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 21.9k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 15.4k

Java13的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft17阅读 11.3k

167 声望
15 粉丝
宣传栏