Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 412новых вакансий за сутки·55 411вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 671
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 728
  • Облачные технологии6 606
  • QA вакансии2 165
  • Android1 317
  • Инженер данных878
  • Продакт-менеджер314

Разработка

  • iOS1 229
  • Backend вакансии1 210
  • AI вакансии545
  • Fullstack вакансии500
  • Frontend вакансии422
  • Mobile вакансии28

По стеку

  • Go5 192
  • Java3 112
  • Kotlin1 085
  • Node.js992
  • Rust846
  • .NET660
  • PHP319
  • C++266
  • C#208

DevOps и инфраструктура

  • Kubernetes3 904
  • Linux-инфраструктура2 843
  • DevOps вакансии2 684
  • Terraform / IaC2 162
  • Мониторинг и Observability1 062
  • CI/CD921
  • SRE303
  • Кибербезопасность31

Аналитика и данные

  • Аналитик данных537
  • Data Scientist445
  • Бизнес-аналитик402
  • Системный аналитик68

Другие направления

  • Проджект-менеджер103
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 394

По уровню

  • Senior вакансии23 003
  • Middle вакансии11 899
  • Junior вакансии3 939

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise186 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Spring BootВсе вопросы
Spring BootMiddleТеория

Что такое CommandLineRunner и ApplicationRunner и когда их использовать?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

CommandLineRunner и ApplicationRunner — функциональные интерфейсы, чьи run()-методы вызываются после полной инициализации ApplicationContext. CommandLineRunner получает String[], ApplicationRunner — ApplicationArguments с именованными опциями. Оба блокируют завершение старта до возврата из run().

CommandLineRunner — сырые аргументы

@Component
@Order(1)
public class DataSeeder implements CommandLineRunner {

    private final UserRepository userRepo;

    public DataSeeder(UserRepository userRepo) {
        this.userRepo = userRepo;
    }

    @Override
    public void run(String... args) throws Exception {
        // args = ["--env=prod", "migrate"] — сырые строки из командной строки
        if (userRepo.count() == 0) {
            userRepo.save(new User("admin", "admin@example.com"));
            System.out.println("Seed data inserted");
        }
    }
}

Контракт и порядок вызова

После того как SpringApplication.run() поднял ApplicationContext и вызвал ApplicationContext.refresh(), он обходит все бины типа CommandLineRunner и ApplicationRunner и вызывает их run()-методы. Порядок между несколькими runner-ами задаётся аннотацией @Order или интерфейсом Ordered.

ApplicationRunner — разобранные аргументы

@Component
@Order(2)
public class MigrationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // запуск: java -jar app.jar --mode=migrate --dry-run
        boolean dryRun = args.containsOption("dry-run");
        List<String> modes = args.getOptionValues("mode"); // ["migrate"]
        List<String> nonOption = args.getNonOptionArgs();  // позиционные аргументы

        System.out.printf("Mode: %s, dryRun: %s%n", modes, dryRun);

        if (!dryRun) {
            // реальная миграция
        }
    }
}

Использование в тестах

@SpringBootTest
class DataSeederTest {

    @Autowired
    private UserRepository userRepo;

    @Test
    void seedRuns_whenRepoEmpty() {
        // DataSeeder уже запустился при старте контекста
        assertThat(userRepo.count()).isGreaterThan(0);
    }
}

// Если нужно запустить runner вручную в тесте:
@SpringBootTest
class MigrationRunnerTest {

    @Autowired
    private MigrationRunner runner;

    @Test
    void dryRunDoesNotMutate() throws Exception {
        ApplicationArguments args = new DefaultApplicationArguments("--dry-run");
        runner.run(args); // не бросает исключений, ничего не меняет
    }
}

Типичные сценарии применения

  • Наполнение БД начальными данными (seed)
  • Проверка конфигурации при старте (fail-fast)
  • Запуск однократных миграций данных
  • Прогрев кэша перед принятием трафика
  • CLI-режим: приложение выполняет задачу и завершается

Подводные камни

  • Блокировка readiness: runner блокирует финальный этап старта. Долгий runner задержит сигнал готовности в Kubernetes (readiness probe), что приведёт к таймауту и перезапуску пода. Тяжёлые операции запускайте в отдельном потоке или через @Async.
  • Исключение в run() = падение приложения: непойманное исключение из runner завершит приложение с ненулевым exit code. Оборачивайте в try/catch или используйте retry-логику.
  • Тест-контекст запускает runner-ы: в @SpringBootTest все runner-ы выполняются при каждом поднятии контекста. Если runner делает side-effect (insert в БД), тест может упасть при повторном запуске. Используйте @MockBean для изоляции или проверяйте идемпотентность.
  • CommandLineRunner не разбирает опции: --key=value придёт как одна строка, а не как пара ключ/значение. Для параметризованных CLI используйте ApplicationRunner.
  • Несколько runner-ов без @Order: порядок выполнения недетерминирован, если @Order не задан. В зависимых runner-ах это приведёт к случайным ошибкам.
  • Транзакции в runner: runner-методы не оборачиваются в транзакцию автоматически. Добавьте @Transactional на метод run() или вызывайте транзакционный сервис.
  • Не подходит для периодических задач: runner выполняется один раз при старте. Для повторяющихся задач используйте @Scheduled или внешний планировщик.
  • Профили и условная активация: если runner нужен только в определённой среде, комбинируйте с @Profile("dev") или @ConditionalOnProperty — иначе seed-данные попадут в продакшн.

Типичные ошибки

  • Путать термин «commandline application runner» с соседним механизмом Spring Boot.
  • Не называть границу lifecycle, transaction, thread или request для «commandline application runner».
  • Игнорировать production-эффекты «commandline application runner»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «commandline application runner» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «commandline application runner».
  • Уточнить, какие настройки или API меняют «commandline application runner» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Spring Boot →

Источники

  • https://docs.spring.io/spring-boot/reference/using/auto-configuration.html

Связанные темы

Spring Bootbackend-designtechnical-communication

Вакансии с этим навыком

  • CTO / Java Backend Developer
  • Backend-разработчик (Java/Kotlin)
  • IT Specialists: Cybersecurity, CPO, Java Backend Developer
  • Senior Software Engineer
  • Senior Java-разработчик

Частые вопросы на собеседовании

  • Как реализовать health checks в Spring Boot Actuator?
  • Что делает аннотация @SpringBootApplication?
  • Что такое Spring Boot и чем он отличается от Spring Framework?
  • В каких backend-проектах Spring Boot является сильным выбором, а где лучше выбрать более простой или другой стек?