乐趣区

关于springboot: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 主动注入了啊😳

排查过程:

后果:

初始化文件中 DingRepository 失常

初步猜测:定时工作影响依赖注入。

验证猜测:定时工作影响依赖注入

通过搜寻发现猜测正确!
@Scheduled执行优先级大于 @Autowired,因而不要期待SpringBoot 给咱们实现依赖注入了。

解决办法

ApplicationContextAware

介绍:在我的项目初始化的时候,会去寻找他的 实现类 ,同时通过setApplicationContext 办法将上下文(ApplicationContext)注入进来,当咱们须要的时候便能够依据其封装好的办法获取本人想要的货色。同样他也继承了 BeanFactory,咱们能够依据BeanFactorygetBean获取本人想要的Bean

实例化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 真的能够帮咱们大忙。

退出移动版