barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 25 января 2022 г.

Spring Boot: запуск кода до старта application

Задача

Запустить некий код до того, как начнет запускаться приложение. В моем случае нужно вызвать Security.addProvider().

Решение

Можно, конечно, сделать вызов в методе main() класса, аннотированного как @SpringBootApplication, перед тем, как вызывать SpringApplication.run():

@SpringBootApplication
public class AclImportApplication {
    public static void main(String[] args) {
        Security.addProvider(...);
        SpringApplication.run(AclImportApplication.class);
    }
}

Вот только код main() не вызывается при запуске @SpringBootTest, что создает необходимость создавать какие-то костыли для работоспособности тестов. Более правильный вариант - написать свою имплементацию интерфейса org.springframework.boot.SpringApplicationRunListener, где в методе starting() поместить нужный код. Имплементация должна обязательно иметь конструктор, принимающий SpringApplication app и String[] args, а также ссылку на имплементацию необходимо прописать в META-INF/spring.factories:

org.springframework.boot.SpringApplicationRunListener=my.custom.AppRunListener