Spring Boot bietet zwei Schnittstellen: CommandLineRunner und ApplicationRunner, die zum Ausführen einer speziellen Verarbeitung beim Starten der Anwendung verwendet werden, bevor die run()-Methode von SpringApplication abgeschlossen ist. Im Vergleich zum benutzerdefinierten Listener der ApplicationListener-Schnittstelle von Spring und dem ServletContextListener-Listener von Servlet, die Ihnen im vorherigen Kapitel vorgestellt wurden. Der Vorteil beider Verwendung besteht darin, dass Sie problemlos Anwendungsstartparameter verwenden und verschiedene Initialisierungsvorgänge basierend auf unterschiedlichen Parametern durchführen können.
Implementieren Sie die Schnittstellen CommandLineRunner und ApplicationRunner. Wird normalerweise für die Ausführung spezieller Codes vor dem Start der Anwendung verwendet, z. B.:
Laden häufig verwendeter Systemdaten in den Speicher
Bereinigen von Junk-Daten aus der letzten Ausführung der Anwendung
Versenden von Benachrichtigungen nach dem Systemstart erfolgreich usw.
Ich habe die CommandLineRunner-Schnittstelle implementiert und beim Start der Anwendung die häufig verwendeten Konfigurationsdaten in das System geladen, wie in der folgenden Abbildung dargestellt. Wenn Sie die Daten in Zukunft verwenden, müssen Sie nur die Methode getSysConfigList aufrufen. Es ist nicht erforderlich, die Daten jedes Mal in die Datenbank zu laden. Sparen Sie Systemressourcen und verkürzen Sie die Ladezeit der Daten. 2. Kleines Codeexperiment wird durch die @Component-Definitionsmethode implementiert () und getSourceArgs()
@Slf4j @Component public class CommandLineStartupRunner implements CommandLineRunner { @Override public void run(String... args){ log.info("CommandLineRunner传入参数:{}", Arrays.toString(args)); } }
Erreicht durch die @Bean-Definitionsmethode
Diese Methode kann die Ausführungsreihenfolge angeben. Beachten Sie, dass die ersten beiden Beans CommandLineRunner und die letzte Bean ApplicationRunner sind.@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())); } }
c.z. boot.launch.config .AppStartupRunner: ApplicationRunner-Parametername: [Name, Alter]
c.z.boot.launch.config.AppStartupRunner: ApplicationRunner-Parameterwert: [18]c.z.boot.launch.config.AppStartupRunner: ApplicationRunner-Parameter: [-- name=zimug, - -age=18]
c.z.b.l.config.CommandLineStartupRunner: Eingehende CommandLineRunner-Parameter: [--name=zimug, --age =18]
BeanCommandLineRunner run1()[--name=zimug, --age=18]e=18]BeanCommandLineRunner run2()[--name=zimug, --age=18]
Nach vielen Tests , stellte der Autor fest, dass diese Prioritätsreihenfolge in den Testergebnissen schon immer so war, aber es ist derzeit unklar, ob dies die Norm ist
Die Ausführungspriorität von ApplicationRunner ist höher als die von CommandLineRunnerDie Priorität des Einlaufens von Runner Die Form von Bean ist niedriger als die der Komponentenannotation. Die Art und Weise, wie die Runner-Schnittstelle implementiert wird
Order-Annotation kann nur die Ausführungsreihenfolge desselben CommandLineRunner oder ApplicationRunner garantieren und kann nicht die Reihenfolge über Klassen hinweg garantieren
Die Kernnutzung von CommandLineRunner und ApplicationRunner ist konsistent, das heißt, sie werden für die Ausführung von Spezialcode vor dem Start der Anwendung verwendet. Die Ausführungsreihenfolge von ApplicationRunner geht CommandLineRunner voraus. ApplicationRunner kapselt Parameter in Objekte und stellt Methoden zum Abrufen von Parameternamen, Parameterwerten usw. bereit, was den Vorgang komfortabler macht.
Dies ist ein echtes Problem, auf das der Autor in der Praxis gestoßen ist, das heißt, ich habe mehrere Implementierungen von CommandLineRunner definiert. Es entsteht ein seltsames Problem:
Wenn Sie mehrere Implementierungen von CommandLineRunner definieren, werden eine oder mehrere davon nicht ausgeführt.Analyse: Der folgende Code ist der Code, den SpringBootApplication nach dem Starten des Projekts ausführt. Sie können sehen, dass der CommandLineRunner oder ApplicationRunner durch einen Durchlauf im Code gestartet wird. Mit anderen Worten: Der nächste CommandLineRunner wird erst ausgeführt, nachdem die Ausführung des vorherigen CommandLineRunner abgeschlossen ist, der synchron ausgeführt wird.
@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())); } }; } }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Überwachung von Startereignissen des Springboot-Anwendungsdienstes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!