只有spring等框架管理的bean中的字段、带注解的setter参数及构造函数参数可被注入;static、final未初始化、new创建的对象不可注入。

Java 变量在依赖注入框架中通过注解注入,核心是“标记 + 容器识别 + 反射赋值”。不是所有变量都能被注入,必须满足三个前提:变量所属类由容器管理、注解写法正确、目标类型在容器中有对应 Bean 或配置项。
哪些变量能被注入?
只有 Spring 等框架管理的 Bean 中的字段(成员变量)才能被注解注入。常见可注入位置包括:
- public、protected 或包级访问权限的字段(Spring 4.3+ 也支持 private 字段,但需有默认构造函数)
- 带 @Autowired、@Resource、@Value 等注解的 setter 方法参数
- 构造函数参数(推荐用于不可变依赖)
普通 new 出来的对象、static 字段、final 且无初始化值的字段,都无法被注入——容器不管理它们,反射也无法设值。
@Value 注入配置值
用于把 application.properties 或 application.yml 中的配置项注入到变量中:
- 写法:
@Value("${app.name}")直接取值;@Value("${app.timeout:5000}")带默认值 - 支持类型自动转换:字符串、int、boolean、List、Map(需配合
@ConfigurationProperties更稳妥) - YAML 中嵌套结构如
database.url可直接用点号路径:@Value("${database.url}") - 值含特殊字符(如
:、/)时,配置文件里建议加单引号:url: 'jdbc:mysql://localhost:3306/test'
@Autowired 注入其他 Bean
用于注入 Spring 容器中已注册的组件实例:
- 按类型匹配(byType):
@Autowired private UserService userService; - 多个同类型 Bean 时,加
@Qualifier("userServiceImpl")指定名称 - 允许为空:加
@Autowired(required = false),变量为 null 不报错 - 构造函数注入最安全:
private final UserService userService;+ 构造器参数上加@Autowired
@Resource 和 @Inject 的区别
三者都能完成注入,但语义和默认行为不同:
-
@Autowired是 Spring 特有,优先按类型,再按名称 -
@Resource是 Java EE 标准,默认按名称(name属性),找不到才按类型 -
@Inject来自 JSR-330,行为类似@Autowired,但不支持required=false,需配合@Nullable
实际项目中,Spring 环境下优先用 @Autowired;跨框架或强调标准兼容性时可选 @Inject。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











