1. Введение
Не знаю, получали ли вы такой запрос, но выполняйте какую-то логику сразу после старта проекта. Например, простой прогрев кеша, или трансляция после выхода в интернет и т.п. если вы используетеSpring BootФреймворк может использовать предоставляемый им интерфейсCommandLineRunner
иApplicationRunner
реализовать.
2. CommandLineRunner
org.springframework.boot.CommandLineRunner
даSpring BootПредоставляет интерфейс, когда вы реализуете интерфейс и вводите егоSpring IoCПосле контейнера,Spring BootКогда приложение запускается, оно выполняет своюrun
метод. ОдинSpring Bootможет быть несколькоCommandLineRunner
реализация, когда их несколько, вы можете реализоватьOrdered
Интерфейс управляет порядком выполнения этих реализаций (Чем выше стоимость заказа, тем ниже приоритет). Затем мы объявляем две реализации и указываем порядок:
Приоритетное исполнение:
package cn.felord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* 优先级最高
* 该类期望在springboot 启动后第一顺位执行
* @author felord.cn
* @since 12:57
**/
@Slf4j
@Component
public class HighOrderCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
for (String arg : args) {
log.info("arg = " + arg);
}
log.info("i am highOrderRunner");
}
@Override
public int getOrder() {
return Integer.MIN_VALUE+1;
}
}
Выполнение второго заказа:
package cn.felord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* 优先级低于{@code HighOrderCommandLineRunner}
* @author felord.cn
* @since 12:59
**/
@Slf4j
@Component
public class LowOrderCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
log.info("i am lowOrderRunner");
}
@Override
public int getOrder() {
return Integer.MIN_VALUE+1;
}
}
затем начнитеSpring BootПосле применения консоль выводит результаты в заданном порядке:
2020-05-30 23:11:03.685 INFO 11976 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-30 23:11:03.701 INFO 11976 --- [ main] c.f.Application : Started SpringBootApplication in 4.272 seconds (JVM running for 6.316)
2020-05-30 23:11:03.706 INFO 11976 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-05-30 23:11:03.706 INFO 11976 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner
3. ApplicationRunner
существуетSpring Boot 1.3.0представил еще один иCommandLineRunner
функционально тот же интерфейсApplicationRunner
.CommandLineRunner
получать переменные аргументыString... args
,иApplicationRunner
Получает параметр инкапсулированного объектаApplicationArguments
. В остальном они работают точно так же, даже имена методов одинаковы. объявить одинApplicationRunner
и сделать его самым низким приоритетом:
package cn.felord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* 优先级最低
* @author felord.cn
* @since 13:00
**/
@Slf4j
@Component
public class DefaultApplicationRunner implements ApplicationRunner, Ordered {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("i am applicationRunner");
Set<String> optionNames = args.getOptionNames();
log.info("optionNames = " + optionNames);
String[] sourceArgs = args.getSourceArgs();
log.info("sourceArgs = " + Arrays.toString(sourceArgs));
List<String> nonOptionArgs = args.getNonOptionArgs();
log.info("nonOptionArgs = " + nonOptionArgs);
List<String> optionValues = args.getOptionValues("foo");
log.info("optionValues = " + optionValues);
}
@Override
public int getOrder() {
return Integer.MIN_VALUE+2;
}
}
Результаты выполнения трех классов выводятся по порядку:
2020-06-01 13:02:39.420 INFO 19032 --- [ main] c.f.MybatisResultmapApplication : Started MybatisResultmapApplication in 1.801 seconds (JVM running for 2.266)
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : i am applicationRunner
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : optionNames = []
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : sourceArgs = []
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : nonOptionArgs = []
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : optionValues = null
Ordered
интерфейс не может быть@Order
вместо аннотаций.
4. Передать параметры
Я полагаю, что многие студенты видят здесь и начинают думать об этих двухrun
Меня интересуют параметры метода.Spring BootКогда приложение запускается, оно может принимать параметры, другими словами,Spring Boot
изmain
Методы могут принимать параметры. Эти параметры передаются через командную строкуjava -jar yourapp.jar передавать.CommandLineRunner
Эти интерфейсы будут получены как есть, и эти параметры также могут быть инкапсулированы вApplicationArguments
объект дляApplicationRunner
перечислить. будем знакомыApplicationArguments
Связанный метод:
-
getSourceArgs()Необработанные параметры, переданные приложению, возвращают массив строк этих параметров.
-
getOptionNames()получить имя опции
Set
Коллекция строк. как--spring.profiles.active=dev --debug
вернусь["spring.profiles.active","debug"]
. -
getOptionValues(String name)Получить значение параметра, соответствующее имени по имени. как
--foo=bar --foo=baz
вернусь["bar","baz"]
. -
containsOption(String name)Имя, используемое для определения того, включена ли опция.
-
getNonOptionArgs()Используется для получения всех аргументов, не являющихся параметрами.
Далее давайте попробуем волну, вы можете запуститьSpring BootприменениеJar
java -jar yourapp.jar --foo=bar --foo=baz --dev.name=码农小胖哥 java felordcn
или вIDEAоткрыть в инструментах разработчикаSpring Bootприменениеmain
Элемент конфигурации метода настраивается следующим образом, остальныеIDEИнструменты те же.
бегатьSpring BootПримените, он распечатает:
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = --foo=bar
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = --foo=baz
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = --dev.name=码农小胖哥
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = java
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = felordcn
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : i am applicationRunner
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : optionNames = [dev.name, foo]
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : sourceArgs = [--foo=bar, --foo=baz, --dev.name=码农小胖哥, java, felordcn]
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : nonOptionArgs = [java, felordcn]
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : optionValues = [bar, baz]
Затем вы можете выполнять некоторую логику динамически по мере необходимости.
5. Резюме
Сегодня мыCommandLineRunner
иApplicationRunner
Объяснение, от использования до последовательного выполнения, иSpring BootПередача параметров введена и продемонстрирована, я надеюсь помочь вам. Уделять больше внимания:Код Фермер Маленький Толстый Брат, больше программирования галантереи, чтобы поделиться с вами.
关注公众号:Felordcn获取更多资讯