Spring 三种依赖注入完整示例
字段注入、setter 注入、构造器注入;同时包含 lombok 简化版本
1、字段注入(不推荐,@Resource / @Autowired)
java
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class InjectDemoService {
// ===================== 1、字段注入(不推荐,@Resource / @Autowired) =====================
// @Resource 优先按名字匹配,javax包;@Autowired优先按类型匹配,spring包
@Resource
private RedisCache redisCache1;
}
2、Setter设值注入
java
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class InjectDemoService {
// ===================== 2、Setter设值注入 =====================
private RedisCache redisCache2;
@Autowired
public void setRedisCache2(RedisCache redisCache2) {
this.redisCache2 = redisCache2;
}
}
3、构造器注入(官方推荐,手写构造)
java
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class InjectDemoService {
// ===================== 3、构造器注入(官方推荐,手写构造) =====================
private final RedisCache redisCache3;
// 只有一个构造方法,Spring4.3+ 可以省略@Autowired;多个构造必须加@Autowired
@Autowired
public InjectDemoService(RedisCache redisCache3) {
this.redisCache3 = redisCache3;
}
}
Lombok 简化构造器注入(实际项目最常用)
不需要手写构造函数,@RequiredArgsConstructor自动生成 final 字段构造
java
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class InjectLombokDemoService {
// final修饰,lombok自动生成构造参数完成注入
private final RedisCache redisCache;
}
区分另外两个 lombok 构造注解
@NoArgsConstructor:生成无参构造@AllArgsConstructor:生成全部字段的构造,不管是不是 final@RequiredArgsConstructor:只对final和@NonNull字段生成构造,业务开发首选
注意:需要项目引入 lombok 依赖,IDEA 安装 lombok 插件,否则代码爆红。
面试一句话记忆
@RequiredArgsConstructor + private final = 优雅构造器注入,替代字段上的@Resource/@Autowired。
三种注入对比总结
| 注入方式 | 注解位置 | 能否使用 final | 推荐度 |
|---|---|---|---|
| 字段注入 | 写在成员变量上@Resource |
❌不能 final | 不推荐 |
| Setter 注入 | 写在 set 方法上@Autowired |
❌不能 final | 少用 |
| 构造器注入 | 构造方法(或 lombok @RequiredArgsConstructor) |
✅支持 final | ✅官方推荐 |
面试要点
- final 成员变量只能构造器注入,字段注入、setter 注入都无法赋值 final。
- 构造注入可以保证依赖不为空,对象创建时依赖就必须装配完成。
@RequiredArgsConstructor只会处理final和@NonNull修饰的字段。
注意:RedisCache 必须交给 Spring 管理(加
@Component/@Service),否则注入报错。