@Inject 是 JSR-330 标准注解,Spring Boot 支持但需手动引入 jakarta.inject-api(Java 17+)或 javax.inject 依赖;支持字段、构造器、setter 注入,不支持 required=false 和 @Qualifier,按名称注入需配合 @Named。

@Inject 是 JSR-330 标准注解,不是 Spring 原生的,但在 Spring Boot 中完全支持,用法接近 @Autowired,但更强调标准兼容性与轻量级 DI 场景。
需要先引入依赖
Spring Boot 2.6+ 默认不自带 JSR-330 支持,需显式添加依赖:
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
(注意:Java 17+ 项目建议使用 jakarta.inject:jakarta.inject-api 替代,因 javax.* 已被 Jakarta EE 迁移)
基本注入方式
@Inject 可用于字段、构造器、setter 方法,但不支持 required 属性(即没有类似 @Autowired(required = false) 的写法),默认必须有匹配 Bean,否则启动失败。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 字段注入(不推荐,但可用):
@Inject private UserService userService; - 构造器注入(推荐):
@Inject public OrderService(UserService userService) { this.userService = userService; } - Setter 注入:
@Inject public void setUserService(UserService userService) { this.userService = userService; }
按名称注入:配合 @Named
@Inject 本身只按类型匹配,如需指定 Bean 名称,需搭配 JSR-330 的 @Named 注解:
- 定义 Bean 时标注名称:
@Service @Named("primaryUserService") public class UserServiceImpl implements UserService { ... } - 注入时指定:
@Inject @Named("primaryUserService") private UserService userService;
注意:Spring 中 @Named 的值等同于 @Component("xxx") 或 @Service("xxx") 中的 name,不是类名小写形式(Spring 默认 name 是类名首字母小写,但 @Named 必须显式声明才生效)。
和 @Autowired 的关键区别
对比更常用的方式,便于判断是否该选 @Inject:
- @Inject 是标准注解,适合跨框架(如 CDI、Guice)迁移的项目;@Autowired 是 Spring 专属
- @Inject 不支持
required = false,也不支持@Qualifier—— 要限定名称只能用@Named - Spring 对 @Inject 的处理逻辑与 @Autowired 几乎一致(都走 AutowiredAnnotationBeanPostProcessor),性能无差异
- 构造器注入时,若类只有一个构造器,Spring 4.3+ 可省略 @Inject(也适用于 @Autowired),但显式标注更清晰

















