Каталог статей
1. Аннотация @PostConstruct
Использование аннотации @PostConstruct — самый распространенный способ, проблема в том, что если метод выполнения занимает слишком много времени, проект не сможет предоставлять услуги во время выполнения метода.
@Component
public class StartInit {
//
// @Autowired 可以注入bean
// ISysUserService userService;
@PostConstruct
public void init() throws InterruptedException {
Thread.sleep(10*1000);//这里如果方法执行过长会导致项目一直无法提供服务
System.out.println(123456);
}
}
Два, интерфейс CommandLineRunner
Реализуйте интерфейс CommandLineRunner, а затем вызовите метод, который будет вызываться в методе запуска.Преимущество заключается в том, что при выполнении метода проект инициализируется, и служба может предоставляться в обычном режиме.
В то же время этот метод также может принимать параметры, которые могут быть обработаны в соответствии с параметрами, переданными при запуске проекта: java -jar demo.jar arg1 arg2 arg3.
@Component
public class CommandLineRunnerImpl implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println(Arrays.toString(args));
}
}
3. Реализовать интерфейс ApplicationRunner
Реализация интерфейса ApplicationRunner в основном аналогична реализации интерфейса CommandLineRunner.
Разница только в формате параметров, передаваемых при запуске.CommandLineRunner не имеет ограничений на формат параметров.Формат параметра интерфейса ApplicationRunner должен быть: –key=value
@Component
public class ApplicationRunnerImpl implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
Set<String> optionNames = args.getOptionNames();
for (String optionName : optionNames) {
List<String> values = args.getOptionValues(optionName);
System.out.println(values.toString());
}
}
}
В-четвертых, реализовать ApplicationListener
Реализация интерфейса ApplicationListener и реализация интерфейсов ApplicationRunner и CommandLineRunner не повлияют на службу, и служба может предоставляться в обычном режиме.Обратите внимание на отслеживаемые события, обычно ApplicationStartedEvent или ApplicationReadyEvent, и другие события не могут быть внедрены в bean-компонент.
@Component
public class ApplicationListenerImpl implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("listener");
}
}
Пять, последовательность выполнения четырех методов
Метод аннотации @PostConstruct всегда выполняется первым
Если вы слушаете событие ApplicationStartedEvent, оно должно быть выполнено до CommandLineRunner и ApplicationRunner.
Если вы слушаете событие ApplicationReadyEvent, оно должно выполняться после CommandLineRunner и ApplicationRunner.
CommandLineRunner и ApplicationRunner по умолчанию выполняются сначала ApplicationRunner.Если @Order указан обеими сторонами, они будут выполняться в порядке размера @Order, и больший из них будет выполняться первым.