Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Spring: dependency injection, testing, immutability, spring

Почему внедрение зависимостей через конструктор (@RequiredArgsConstructor) предпочтительнее, чем @Autowired в поле? Какие проблемы решает?

Проверяет понимание принципов DI, преимуществ иммутабельности и тестируемости кода.

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

Внедрение через конструктор делает зависимости явными, класс — иммутабельным и упрощает тестирование. @Autowired в поле скрывает зависимости, усложняет мокирование и может привести к NullPointerException, если Spring не инициализирует поле.

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

Проблемы @Autowired в поле:

  1. Скрытые зависимости: Класс не сигнализирует, что ему нужны зависимости (нет конструктора/сеттеров).

  2. Тестирование: Требует Spring-контекста или рефлексии для внедрения моков.

  3. Иммутабельность: Поля можно менять после создания, что рискованно в многопоточке.

Преимущества конструктора (@RequiredArgsConstructor):

@Service
@RequiredArgsConstructor // Генерирует конструктор с final-полями
public class BookService {
    	private final BookRepository bookRepository; // Зависимость явная и неизменяемая

    	public Book findById(Long id) {
        	return bookRepository.findById(id).orElseThrow();
    	}
}
  • Тестирование без Spring:

    @Test
    void findByIdTest() {
        	BookRepository mockRepo = mock(BookRepository.class);
        	BookService service = new BookService(mockRepo); // Простое создание
        	// ... тест
    }
  • Безопасность: Зависимости инициализируются один раз при создании объекта.

Вывод: Всегда используйте внедрение через конструктор для обязательных зависимостей.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Spring

    Spring

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

#dependency injection

#testing

#immutability

#spring

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