Spring Boot依赖注入核心在于清晰可追溯、可替换、可测试,强调分层职责与构造函数注入优先,结合starter真实集成验证。

Spring Boot 中依赖注入综合实战项目,核心不是堆功能,而是让每个 Bean 的来龙去脉清晰可追溯、可替换、可测试。它不靠“全加 starter”启动成功,而靠理解谁注入谁、为什么能注入、哪里可能断链。
明确注入目标与分层职责
先画出业务主线:比如一个「用户登录后查订单」流程,至少涉及 Controller → Service → Mapper(或 Repository)→ 数据源。每一层只依赖下一层的接口,不依赖具体实现类。这样注入才有意义,也方便后续单元测试或换实现(比如把 MySQL 换成 Redis 缓存订单)。
- Controller 层用 @Autowired 注入 Service 接口(不是实现类)
- Service 实现类用 构造函数注入 Mapper 接口(推荐,避免空指针、利于测试)
- Mapper 接口由 MyBatis-Plus 或 Spring Data JPA 自动代理,无需手动注入
- 若需外部配置(如短信模板、支付密钥),用 @ConfigurationProperties 绑定对象,再注入到 Service 中
三种注入方式选对场景
字段注入(@Autowired private XxxService service;)写得快,但隐藏了依赖关系,不利于单元测试;setter 注入略显冗余;构造函数注入最稳妥,Spring Boot 4.3+ 已支持无 @Autowired 的构造注入(只要类只有一个构造函数)。
- 新项目统一用构造函数注入,尤其 Service 和 Configuration 类
- 工具类、配置类中需要注入多个同类型 Bean 时,用 @Qualifier 指定名称
- 可选依赖加 @Autowired(required = false),避免容器启动失败
- 集合注入(如所有实现了
Handler的 Bean)直接声明List,Spring 自动收集>
排查注入失败的常见路径
启动报 UnsatisfiedDependencyException 或 NoUniqueBeanDefinitionException,别急着改代码,按顺序检查:
- 确认目标类是否加了 @Component、@Service、@Repository 等组件注解,且在
@SpringBootApplication扫描包路径内 - 检查是否因 Maven 依赖缺失导致类根本没进 classpath(例如用了
Jackson2ObjectMapperBuilder却没引spring-boot-starter-web) - 查看是否有两个同类型 Bean(比如自己定义了一个
RedisTemplate,又引入了spring-boot-starter-data-redis自动配置的),用 @Primary 或 @Qualifier 明确意图 - 启用 debug 启动:
--debug参数,Spring Boot 会输出自动配置报告,快速定位哪个 AutoConfiguration 没生效、哪个 Bean 没创建
结合 starter 做真实集成
依赖注入不是孤立动作,要放在整合上下文中验证。比如引入 spring-boot-starter-security 后,SecurityFilterChain 是一个典型被自动配置并注入的 Bean;你自定义的 UserDetailsService 被注入进 Security 配置里,才能真正起效。
- 加
spring-boot-starter-cache后,CacheManager自动注入,你只需在 Service 方法上加@Cacheable - 加
spring-boot-starter-validation后,ValidatorBean 可直接注入使用,无需 new - 所有 starter 提供的 Bean 都遵循命名规范(如
redisTemplate、objectMapper),可在 IDE 中 Ctrl+Click 跳转确认来源











