Spring Boot menyediakan dua antara muka: CommandLineRunner dan ApplicationRunner, yang digunakan untuk melakukan pemprosesan khas apabila memulakan aplikasi digunakan dalam SpringApplication Kaedah run() dilaksanakan sebelum larian selesai. Berbanding dengan pendengar tersuai antara muka ApplicationListener Spring dan pendengar ServletContextListener yang diperkenalkan kepada anda dalam bab sebelumnya. Kelebihan menggunakan kedua-duanya ialah anda boleh menggunakan parameter permulaan aplikasi dengan mudah dan melakukan operasi pemula yang berbeza berdasarkan parameter yang berbeza.
Laksanakan antara muka CommandLineRunner dan ApplicationRunner. Biasanya digunakan untuk pelaksanaan kod khas sebelum aplikasi bermula, seperti:
Muatkan data yang biasa digunakan sistem ke dalam memori
Kali terakhir aplikasi menjalankan Pembersihan data sampah
Penghantaran pemberitahuan selepas kejayaan sistem dimulakan, dsb.
Saya melaksanakan antara muka CommandLineRunner dan memuatkan sistem apabila aplikasi dimulakan. Data konfigurasi yang biasa digunakan ditunjukkan dalam rajah di bawah. Muatkan daripada pangkalan data ke dalam memori Apabila menggunakan data pada masa hadapan, anda hanya perlu memanggil kaedah getSysConfigList. Tidak perlu memuatkan data dalam pangkalan data setiap kali. Menjimatkan sumber sistem dan mengurangkan masa memuatkan data.
CommandLineRunner: Parameter ialah tatasusunan rentetan
@Slf4j @Component public class CommandLineStartupRunner implements CommandLineRunner { @Override public void run(String... args){ log.info("CommandLineRunner传入参数:{}", Arrays.toString(args)); } }
ApplicationRunner: The parameter ialah Letakkannya dalam ApplicationArguments dan dapatkan parameter melalui getOptionNames(), getOptionValues(), getSourceArgs()
@Slf4j @Component public class AppStartupRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { log.info("ApplicationRunner参数名称: {}", args.getOptionNames()); log.info("ApplicationRunner参数值: {}", args.getOptionValues("age")); log.info("ApplicationRunner参数: {}", Arrays.toString(args.getSourceArgs())); } }
Kaedah ini boleh menentukan perintah pelaksanaan, bayar perhatian kepada dua Bean pertama ialah CommandLineRunner, dan Bean terakhir ialah ApplicationRunner.
@Configuration public class BeanRunner { @Bean @Order(1) public CommandLineRunner runner1(){ return new CommandLineRunner() { @Override public void run(String... args){ System.out.println("BeanCommandLineRunner run1()" + Arrays.toString(args)); } }; } @Bean @Order(2) public CommandLineRunner runner2(){ return new CommandLineRunner() { @Override public void run(String... args){ System.out.println("BeanCommandLineRunner run2()" + Arrays.toString(args)); } }; } @Bean @Order(3) public ApplicationRunner runner3(){ return new ApplicationRunner() { @Override public void run(ApplicationArguments args){ System.out.println("BeanApplicationRunner run3()" + Arrays.toString(args.getSourceArgs())); } }; } }
Anda boleh menetapkan perintah pelaksanaan melalui @Order
Tambahkan parameter berikut pada konfigurasi permulaan Springboot IDEA, simpan dan mulakan aplikasi<. 🎜>
Hasil keluaran ujian:c.z.boot.launch.config.AppStartupRunner : Nama parameter ApplicationRunner: [nama, umur]The penulis telah mengujinya berkali-kali Didapati bahawa dalam keputusan ujian, susunan keutamaan ini sentiasa seperti ini, tetapi pada masa ini tidak jelas sama ada ini adalah normac.z.boot .launch.config. AppStartupRunner : Nilai parameter ApplicationRunner: [18]
BeanApplicationRunner run3 ()[-- name=zimug, --age=18]c.z.b.l.config.CommandLineStartupRunner : Parameter masuk CommandLineRunner: [--name=zimug, --age=18]
c.z.boot.launch.config.AppStartupRunner : Parameter ApplicationRunner: [--name=zimug, --age=18]BeanCommandLineRunner run1() [--name =zimug, --age=18]
e=18]
BeanCommandLineRunner run2()[--name=zimug, --age=18]
Apabila anda mentakrifkan berbilang pelaksanaan CommandLineRunner, satu atau beberapa daripadanya tidak akan dilaksanakan.
Analisis: Kod berikut ialah kod yang SpringBootApplication akan laksanakan selepas memulakan projek Anda boleh melihat bahawa CommandLineRunner atau ApplicationRunner dimulakan melalui traversal dalam kod. Dalam erti kata lain, CommandLineRunner seterusnya akan dilaksanakan hanya selepas pelaksanaan CommandLineRunner sebelumnya selesai, yang dilaksanakan secara serentak.private void callRunners(ApplicationContext context, ApplicationArguments args) { List<Object> runners = new ArrayList<>(); runners.addAll(context.getBeansOfType(ApplicationRunner.class).values()); runners.addAll(context.getBeansOfType(CommandLineRunner.class).values()); AnnotationAwareOrderComparator.sort(runners); for (Object runner : new LinkedHashSet<>(runners)) { if (runner instanceof ApplicationRunner) { callRunner((ApplicationRunner) runner, args); } if (runner instanceof CommandLineRunner) { callRunner((CommandLineRunner) runner, args); } } }
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pemantauan acara permulaan perkhidmatan aplikasi springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!