前言
日志零碎须要每天推送每天日志统计到钉钉群,至于如何实现向钉钉推送请参考:java(SpringBoot)实现钉钉推送。学长他们的用的是一个固定的Webhook
和secrect
,这样就会导致一个问题,下次批改推送群那么就须要批改源代码,于是乎我加了一个钉钉数据表
,这样就能够做到随便更改推送群了。
实现过程:
增加钉钉实体:
次要字断:webhook
、secrect
/** * 钉钉 * @author hzl */@Entitypublic 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
,咱们能够依据BeanFactory
的getBean
获取本人想要的Bean
。
实例化ApplicationContextAware
,给出如下参考:
@Componentpublic 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
真的能够帮咱们大忙。