Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: dependency, injection, constructor, setter, field

Какие способы внедрения зависимостей существуют в Spring?

Вопрос проверяет знание основных подходов Dependency Injection в Spring и умение оценивать их плюсы и минусы.

Короткий ответ

В Spring существуют constructor-injection, setter-injection и field-injection. На практике чаще всего используют внедрение через конструктор. Оно делает зависимости явными и упрощает тестирование. Setter-injection применяется для необязательных зависимостей. Field-injection считается наименее предпочтительным.

Длинный ответ

Spring поддерживает несколько способов внедрения зависимостей, каждый из которых имеет свои сценарии применения.

Определение

Dependency Injection — это принцип, при котором объект получает зависимости извне, а не создаёт их сам.

Основные способы внедрения

Перед перечислением важно отметить, что все способы работают через контейнер Spring, различается только момент и форма передачи зависимости.

1. Внедрение через конструктор

Самый рекомендуемый способ.

@Component
class OrderService {

    private final PaymentService paymentService;

    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

Плюсы:

  1. Все зависимости обязательны и явны

  2. Объект всегда в корректном состоянии

  3. Удобно писать unit-тесты

  4. Хорошо сочетается с final

Минусы:

  • Конструктор может разрастаться при большом числе зависимостей

2. Внедрение через сеттеры

Используется реже и в специфических случаях.

@Component
class ReportService {

    private Formatter formatter;

    @Autowired
    void setFormatter(Formatter formatter) {
        this.formatter = formatter;
    }
}

Плюсы:

  1. Подходит для необязательных зависимостей

  2. Можно менять зависимость после создания бина

Минусы:

  • Объект может быть создан в неполном состоянии

3. Field-injection

Самый простой, но наименее рекомендуемый способ.

@Component
class UserService {

    @Autowired
    private UserRepository repository;
}

Минусы:

  1. Зависимости скрыты

  2. Сложно тестировать без Spring

  3. Нельзя использовать final

  4. Нарушает принцип явности

Вывод

Лучший выбор по умолчанию — constructor-injection. Остальные способы стоит использовать только при наличии чёткой причины.

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Spring

    Spring

Ключевые слова

#dependency

#injection

#constructor

#setter

#field

Подпишись на Java Developer в телеграм