相信现在springboot已经是java码农必备的框架了,从今天起的闲暇时间中我会分享一些在springboot中的骚操作。关注我每天进步一点点,未来的大佬就是你了。
不知道你有没有接到这种需求,项目启动后立马执行一些逻辑。比如缓存预热,或者上线后的广播之类等等。可能现在没有但是将来会有的。想想你可能的操作, 写个接口上线我调一次行吗?NO!NO!NO!这种初级菜鸟才干的事。今天告诉你个骚操作,写出来让人一看起码经验加倍。利用下面这个接口将使得你的代码更加优雅,逼格更高。
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 后结果
果然达到预期目的,那么这两个接口啥区别呢?spring官方不会吃饱了没事干弄两个这来折腾人,应该是有区别的,根据接口方法run方法可以看出来参数都不一样,额外科普一下 springboot 如何传递额外参数通过命令行 执行 java -jar 传递给 main 方法,规则如下
- 键值对 格式为 --k=v 多个 空格隔开
- 值 多个空格隔开
下面我以这两种为实验对象操作一波
--foo=bar --dev.name=码农小胖哥 java springboot
在idea 开发工具中打开main方法配置项,进行如下配置,其他ide工具同理。
然后DefaultApplicationRunner 代码改为如下图
重新启动 springboot 结果为
arg= 为 CommandLineRunner 的 args数组打印,单纯把 上面的参数 空格为规则解析成了原汁原味的数组。下面那一系列花里胡哨的操作 是ApplicationRunner 中ApplicationArguments的杰作。通过打印可以知道
- args.getOptionNames() 是获取键值对 --k=v 中的 k
- args.getOptionValues("foo") 用来通过k 来获取键值对的值v
- args.getSourceArgs() 等同于 CommandLineRunner 的 args数组
- args.getNonOptionArgs() 最惨 用来获取单身狗
要注意的是 解析ApplicationArguments 要处理空指针问题。
通过上面的介绍和演示,你脑海中是不是有了新的骚操作呢?有请留言告诉我。我是 码农小胖哥 关注我 有更多干货奉上。别忘记点个赞哦。