В каком случае в Spring можно не указывать аннотацию @Autowired?

«В каком случае в Spring можно не указывать аннотацию @Autowired?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Начиная с Spring Framework 4.3, аннотацию @Autowired можно опустить для единственного конструктора класса. Фреймворк автоматически выполнит внедрение зависимостей через этот конструктор. Это часть конвенции over configuration, упрощающей код.

Правило:

  • Если у бина один конструктор, @Autowired не нужен.
  • Если конструкторов несколько, необходимо аннотировать тот, через который Spring должен внедрять зависимости.
  • Для внедрения в поля или сеттер-методы аннотация @Autowired по-прежнему обязательна.

Пример (автовнедрение без @Autowired):

@Service
public class UserService {
    private final UserRepository repository;

    // Spring автоматически внедрит UserRepository
    public UserService(UserRepository repository) {
        this.repository = repository;
    }
}

Пример (требуется @Autowired):

@Component
public class ExampleService {
    private final DependencyA depA;
    private DependencyB depB;

    // Нужен @Autowired, так как конструкторов два
    @Autowired
    public ExampleService(DependencyA depA) {
        this.depA = depA;
    }

    // Внедрение в поле - аннотация обязательна
    @Autowired
    public void setDepB(DependencyB depB) {
        this.depB = depB;
    }
}