前言一般项目中的初始化操作,第一次见,很精彩。如果有什么其他的初始化操作的方法,欢迎在评论区分享~ApplicationRunner和CommandLineRunnerSpringBoot应用程序,在启动的时候,如果你想做一些事情,比如预加载和缓存一些数据,读取一些配置等。等待。总而言之,在做一些初始化操作的时候,SpringBoot提供了两个接口来帮助我们实现。这两个接口是:ApplicationRunner接口CommandLineRunner接口源代码如下:ApplicationRunnerpackageorg.springframework.boot;importorg.springframework.core.Ordered;importorg.springframework.core.annotation.Order;/***Interfaceusedtoindicatethata当bean包含在一个{@linkSpringApplication}中时,它应该运行。多个{@linkApplicationRunner}beans可以在同一个应用程序上下文中定义*并且可以使用{@linkOrdered}*接口或{@linkOrder@Order}注释进行排序。**@authorPhillipWebb*@since1.3.0*@seeCommandLineRunner*/@FunctionalInterfacepublicinterfaceApplicationRunner{/***用于运行bean的回调。*@paramargs传入的应用程序参数*@throwsExceptiononerror*/voidrun(ApplicationArgumentsargs)throwsException;}CommandLineRunnerpackageorg.springframework.boot;importorg.springframework.core.Ordered;importorg.springframework.core.annotation。命令;/***接口用于指示bean在包含在{@linkSpringApplication}中时应该运行。多个{@linkCommandLineRunner}bean可以在同一个应用程序上下文中定义*并且可以使用{@linkOrdered}*接口或{@linkOrder@Order}注释进行排序。*
*如果您需要访问{@linkApplicationArguments}而不是原始字符串数组*考虑使用{@linkApplicationRunner}。**@authorDaveSyer*@since1.0.0*@seeApplicationRunner*/@FunctionalInterfacepublicinterfaceCommandLineRunner{/***用于运行bean的回调。*@paramargs传入主方法参数*@throwsExceptiononerror*/voidrun(String...args)throwsException;}可以看到,这两个接口的注释几乎一模一样,大致意思就是这两个接口可以指定一个Bean在Spring环境中运行(run)你想做的事情,如果有多个bean指定,可以通过Ordered接口或者@Order注解来指定执行顺序。说白了,你可以有多个实现类来实现这两个接口,通过@Order来决定谁先跑谁后跑。@Order查看@Order注解的源代码:/***{@code@Order}定义了注解组件的排序顺序。**
{@link#value}是可选的,表示在*{@linkOrdered}接口中定义的订单值。较低的值具有较高的优先级。默认值为*{@codeOrdered.LOWEST_PRECEDENCE},表示最低优先级(输给任何其他*指定的顺序值)。*.....省略剩余注释*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})@Documentedpublic@interfaceOrder{/***顺序值。*
默认为{@linkOrdered#LOWEST_PRECEDENCE}。*@seeOrdered#getOrder()*/intvalue()defaultOrdered.LOWEST_PRECEDENCE;}Ordered.LOWEST_PRECEDENCE的默认值为Integer.MAX_VALUE。在最上面的注释中可以知道,@Order注解定义了@Component注解的Bean的排序顺序(definesthesortorderforanannotatedcomponent),然后@Order注解的value属性越低,Bean的值越低,值越低的优先级越高。测试分别写两个实现类,分别实现这两个接口,然后启动SpringBoot项目,看看执行顺序("我正在加载------------------>ApplicationRunnerImpl");}}CommandLineRunnerImpl:@Slf4j@ComponentpublicclassCommandLineRunnerImplimplementsCommandLineRunner{@Overridepublicvoidrun(String...args)throwsException{log.info("我正在加载------------------>CommandLineRunnerImpl");}}控制台输出:2023-03-2615:46:38.344INFO25616---[main]c.g.demo.init.ApplicationRunnerImpl:Iamloading------------------->ApplicationRunnerImpl2023-03-2615:46:38.344INFO25616---[main]c.g.demo.init.CommandLineRunnerImpl:我正在加载------------------>CommandLineRunnerImpl可以看到ApplicationRunnerImpl先运行,??CommandLineRunnerImpl在Inprogress之后。我们在CommandLineRunnerImpl中添加@Order注解,并将其值属性设置为10:@Slf4j@Order(10)@ComponentpublicclassCommandLineRunnerImplimplementsCommandLineRunner{@Overridepublicvoidrun(String...args)throwsException{log.info("I正在加载------------------>CommandLineRunnerImpl");}}控制台输出:2023-03-2615:50:43.524INFO16160---[main]c.g.demo.init.CommandLineRunnerImpl:I'mloading-------------------->CommandLineRunnerImpl2023-03-2615:50:43.524信息16160---[主要]c.g.demo。init.ApplicationRunnerImpl:Iamloading------------------>ApplicationRunnerImpl区别又回到这两个接口上,看似一模一样,但肯定有细微差别,最重要的区别是接口的抽象方法的参数。ApplicationRunner:voidrun(ApplicationArgumentsargs)抛出异常;CommandLineRunner:voidrun(String...args)抛出异常;具体来说,ApplicationRunner接口的run方法中的参数是ApplicationArguments对象,它封装了命令行参数和选项。CommandLineRunner接口的run方法中的参数是String数组,直接包含了应用程序启动时传入的命令行参数和选项。测试并打印命令行参数:@Slf4j@ComponentpublicclassApplicationRunnerImplimplementsApplicationRunner{@Overridepublicvoidrun(ApplicationArgumentsargs)throwsException{System.out.println("ApplicationRunner:optionNames="+args.getOptionNames()+",sourceArgs="+args.getSourceArgs());}}@Slf4j@ComponentpublicclassCommandLineRunnerImplimplementsCommandLineRunner{@Overridepublicvoidrun(String...args)throwsException{System.out.println("CommandLineRunner:"+Arrays.toString(args));}}使用Maven将项目打包为Jar包,启动Jar包://使用java-jar启动,添加两个参数:name和descriptionjava-jardemo-0.0.1-SNAPSHOT.jar--name=god23bin--description=like_meOutput:ApplicationRunner:optionNames=[name,description]sourceArgs=[Ljava.lang.String;@5c90e579CommandLineRunner:[--name=god23bin,--description=like_me]最后是我的等级有绑定由于局限性而出现错误和不足。如果你发现了什么,请指出!最后,感谢您阅读本文,感谢您认真对待我的努力,希望这篇博客对您有所帮助!你轻轻点点头,就像,那会在我心里为你的内心世界增添一颗璀璨耀眼的星!