依赖注入类(Bean 注入)
Spring 核心特性,无需手动 new 对象,从 Spring 容器中自动获取已注册的 Bean,降低组件间耦合度。
| 注解 | 作用说明 |
|---|---|
@Autowired |
Spring 提供的依赖注入注解,按类型注入(优先匹配 Bean 的类型),若有多个同类型 Bean 会报错 |
@Resource |
JDK 提供的依赖注入注解,按名称注入(优先匹配 Bean 的名称),也可按类型注入,兼容性更强 |
@Qualifier |
配合 @Autowired 使用,指定要注入的 Bean 名称,解决同类型 Bean 冲突问题 |
// 1. 先定义两个同类型的 Bean(用于测试冲突场景)
@Configuration
public class BeanConfig {
// Bean 名称:user1
@Bean
public User user1() {
User user = new User();
user.setUsername("用户1");
return user;
}
// Bean 名称:user2(同类型,与 user1 冲突)
@Bean
public User user2() {
User user = new User();
user.setUsername("用户2");
return user;
}
}
// 2. 依赖注入示例(Service 层,调用前面的 Mapper)
@Service
public class InjectService {
// 方式1:@Autowired 按类型注入(无冲突时使用)
@Autowired
private UserMapper userMapper;
// 方式2:@Autowired + @Qualifier(解决同类型 Bean 冲突)
@Autowired
@Qualifier("user1") // 指定注入名称为 user1 的 Bean
private User user1;
// 方式3:@Resource 按名称注入(直接指定 Bean 名称)
@Resource(name = "user2")
private User user2;
// 测试注入结果
public void printInject() {
System.out.println("user1:" + user1.getUsername()); // 输出:用户1
System.out.println("user2:" + user2.getUsername()); // 输出:用户2
System.out.println("Mapper 是否注入:" + (userMapper != null)); // 输出:true
}
}
// 3. 控制层调用,验证注入
@RestController
@RequestMapping("/inject")
public class InjectController {
@Autowired
private InjectService injectService;
@GetMapping("/test")
public String testInject() {
injectService.printInject();
return "注入测试完成,查看控制台输出";
}
}