springboot 启动后打印_小胖哥java干货分享:springboot应用的一些骚操作(1)

57ca6455daaf43508725c47eee6647c6

相信现在springboot已经是java码农必备的框架了,从今天起的闲暇时间中我会分享一些在springboot中的骚操作。关注我每天进步一点点,未来的大佬就是你了。

不知道你有没有接到这种需求,项目启动后立马执行一些逻辑。比如缓存预热,或者上线后的广播之类等等。可能现在没有但是将来会有的。想想你可能的操作, 写个接口上线我调一次行吗?NO!NO!NO!这种初级菜鸟才干的事。今天告诉你个骚操作,写出来让人一看起码经验加倍。利用下面这个接口将使得你的代码更加优雅,逼格更高。

07fa5607f632426b8ac3fd2adc2f8925

org.springframework.boot.CommandLineRunner

简单翻译一下意思就是 当springApplication 启动后,在同一应用上下文中定义的多个CommandLineRunner类型的spring bean 按照标记顺序执行。如果你想替代以数组方式接收args参数 可以用 另一个接口代替

org.springframework.boot.ApplicationRunner

talk is cheap show your code,下面我就来操作一波演示一下。

优先级比较高的CommandLineRunner实现

/** * 优先级比较高 通过实现接口{@link Ordered}的方式 来指定优先级 * 该类期望在springboot 启动后第一位执行 * @author dax * @since 2019/6/17 23:06 */@Slf4j@Componentpublic class HighOrderCommandLineRunner implements CommandLineRunner , Ordered { @Override public void run(String... args) throws Exception { for (String arg : args) { System.out.println("arg = " + arg); } log.info("i am highOrderRunner"); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; }}

优先级比较低的 CommandLineRunner 实现

/** * 优先级比较低 通过注解{@link Order}方式来指定优先级 * 比最优大64 说明会在 {@link HighOrderCommandLineRunner} 之后执行 * * @author dax * @since 2019/6/17 23:07 */@Slf4j@Order(Ordered.HIGHEST_PRECEDENCE + 64)@Componentpublic class LowOrderCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("i am lowOrderRunner"); }}

用ApplicationRunner实现一个优先级比上面更低的

 /** * @author dax * @since 2019/6/18 22:13 */@Slf4j@Componentpublic class DefaultApplicationRunner implements ApplicationRunner, Ordered { @Override public void run(ApplicationArguments args) throws Exception { log.info("i am applicationRunner");  } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE+65; }}

启动springboot 后结果

b504a0ea7b5f49ccb5bffc2e80b15832

果然达到预期目的,那么这两个接口啥区别呢?spring官方不会吃饱了没事干弄两个这来折腾人,应该是有区别的,根据接口方法run方法可以看出来参数都不一样,额外科普一下 springboot 如何传递额外参数通过命令行 执行 java -jar 传递给 main 方法,规则如下

  • 键值对 格式为 --k=v 多个 空格隔开
  • 值 多个空格隔开

下面我以这两种为实验对象操作一波

 --foo=bar --dev.name=码农小胖哥 java springboot

在idea 开发工具中打开main方法配置项,进行如下配置,其他ide工具同理。

b43da5bfe9df4e34b842e02d73959aee

然后DefaultApplicationRunner 代码改为如下图

bb4ff93f32884e17814262ca087ebae0

重新启动 springboot 结果为

d0caa1bd93a346efaa0961e0e3d2f576

arg= 为 CommandLineRunner 的 args数组打印,单纯把 上面的参数 空格为规则解析成了原汁原味的数组。下面那一系列花里胡哨的操作 是ApplicationRunner 中ApplicationArguments的杰作。通过打印可以知道

  • args.getOptionNames() 是获取键值对 --k=v 中的 k
  • args.getOptionValues("foo") 用来通过k 来获取键值对的值v
  • args.getSourceArgs() 等同于 CommandLineRunner 的 args数组
  • args.getNonOptionArgs() 最惨 用来获取单身狗

要注意的是 解析ApplicationArguments 要处理空指针问题。

通过上面的介绍和演示,你脑海中是不是有了新的骚操作呢?有请留言告诉我。我是 码农小胖哥 关注我 有更多干货奉上。别忘记点个赞哦。

eb48de307ff04e788c8e99e0248c7389
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值