Skip to content

依赖注入类(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 "注入测试完成,查看控制台输出";
    }
}