结果:创建一个新类来实现ApplicationRunner接口,在这里进行第一次的启动时启动定时器,如此就能使用@Value等注解,将application文件中的内容使用Spring的方式读取到。
过程:我需要一个定时器,然后正好项目依赖了hutool,就百度了下如何使用hutool的定时器,之前知道hutool有这个东西,但是没用过。
hutool的定时器使用挺简单的,然后鉴于项目第一次启动的时候就要执行一次定时器,然后我就直接在Spring boot的启动类中,写了个代码:
public static void main(String[] args) { SpringApplication.run(App.class, args); CronUtil.setMatchSecond(true); CronUtil.start(); new StockPriceTask().stockPrice(); // 手动调用定时器的方法 }
嗯~ o(* ̄▽ ̄*)o,很简单哦,然后就被这么一个new给坑死了,今天项目要部署,然后这里直接就凉了。
对方要求使用外部配置文件的方法,也就是说我必须得把定时器中用到的一系列值全部放入application文件,然后就出现问题了,我直接new的定时器,导致不是被Spring管理的,没有用到依赖注入。实际上,不管是不是new出来的类实例,把这个定时器的初启动写在这个main方法中就已经凉凉了。因为main方法是一个静态的,你@Autowired进来的对象只能是非静态的,然后main方法不能使用。
后面被这个难到了,没有找对方向,然后正好hutool提供了一个Setting的类,这个玩意还挺强的,之前我用的流读取properties文件,然后项目通过jenkins部署到对方的测试环境的时候发现路径不对,找不到resource下的文件了,然后对方给了个jenkins的权限,钩子也在gitlab上部署好了,我自己就能随便上传代码随便部署,然后就发现hutool的Setting能解决流在本地可以正确读取文件但是部署后路径错误的问题,就直接用的Setting了,悲剧就从这里开始,因为配置挺多的,后面改来改去花了半天时间,从下午3点一直搞到9点半。
最后项目要上线,对方要求外部文件配置的方式,嗯~ o(* ̄▽ ̄*)o,然后就彻底凉了,因为这代表不能写死文件的读取路径了,也就是Setting这种方式就完全不能用。
后面大哥和对方交流过后,知道对方用的是
spring.config.location
这种方式来在项目启动时配置外部文件,然后就找方法解决。
哎,自己太菜了。后面大哥和我交流了一下项目(因为项目技术挺简单的,一直将近一个月了都是我在负责,另外一位大哥负责技术点的攻克),然后就给我整了个类实现ApplicationRunner接口,重写run方法,在该类中注入定时器,然后在run方法中开始调用定时器。代码就变成了这样:
public static void main(String[] args) { // SpringBoot的启动类 SpringApplication.run(App.class, args); }
然后实现ApplicationRunner的类
@Slf4j @Component @RequiredArgsConstructor public class StartStockPrice implements ApplicationRunner { private final StockPriceTask stockPriceTask; @Override public void run(ApplicationArguments args) { CronUtil.setMatchSecond(true); CronUtil.start(); try { stockPriceTask.taskStockPrice(); }catch (Exception e){ log.error(e.getMessage()); } } }
如此一来,这个定时器StockPriceTask类就被注入了,因此该类就加上一个@Service注解就可以开始用SpringBoot自带的@Value或者其他一些读取application文件的注解来注入配置属性。
其实,这个ApplicationRunner启动类都是比较基础的东西,但是无奈自己太菜了啊。今天菜的把自己笑死。
今天收获还是有一点的,下面再记录一下怎么SpringBoot读取外部配置启动。