Ответ
@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 предпочтительнее для написания кода, независимого от фреймворка.