Что такое аннотация @Inject и чем она отличается от @Autowired?

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

Ответ

@Inject — это стандартная аннотация из спецификации JSR-330 (Dependency Injection for Java). Она предназначена для внедрения зависимостей и является альтернативой Spring-специфичной аннотации @Autowired.

Как используется: Аннотацию можно применять к конструктору, полю или сеттер-методу. Контейнер внедрения зависимостей (DI-контейнер) автоматически найдет и внедрит подходящий бин.

Пример внедрения через конструктор:

import javax.inject.Inject;

public class CarService {
    private final EngineService engineService;

    @Inject // DI-контейнер внедрит EngineService
    public CarService(EngineService engineService) {
        this.engineService = engineService;
    }
}
Сравнение @Inject (JSR-330) и @Autowired (Spring): Особенность @Inject (javax.inject) @Autowired (org.springframework)
Стандарт Часть Java-стандарта (JSR-330). Специфична для Spring Framework.
Обязательность Не имеет атрибута required. Зависимость всегда обязательна. Имеет атрибут required=false.
Квалификаторы Использует @Named или собственные аннотации с @Qualifier. Использует @Qualifier.
Поддержка Работает в любом совместимом с JSR-330 контейнере (Guice, CDI, Spring). Работает только в Spring-контексте.

Практический вывод: В Spring можно использовать любую из этих аннотаций. @Autowired предлагает больше Spring-специфичных возможностей (например, required), в то время как @Inject предпочтительнее для написания кода, независимого от фреймворка.