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