当前位置: 首页 > news >正文

Spring的IOC详解

IOC=控制反转(思想),把「创建对象、管理依赖」的控制权,从程序员手里,交给容器。容器解决了“对象管理”问题。不用自己 new 对象了

DI=依赖注入(实现IOC的手段),实现分为:构造器注入、setter()注入、接口注入三种,将对象需要的依赖传递给它,而不是让对象自行创建依赖

Spring官方推荐

Spring团队明确推荐使用构造器注入,主要原因:

  1. 确保依赖不可变:final关键字保证
  2. 确保对象完全初始化:构造完成后就可使用
  3. 避免空指针异常:依赖不可能为null
  4. 更好的可测试性:构造时就确定所有依赖
  5. 非强制加final关键字,官方推荐规范加final

注入方式示例

1、构造器注入

/** * 用户 Controller */ @RestController @RequestMapping("/") public class UserController { // 1. 定义 private final private final UserService userService; /** * 构造器注入 * 2. 只有一个构造器,Spring 自动注入,不用 @Autowired */ public UserController(UserService userService) { this.userService = userService; } }

lombok简化版@RequiredArgsConstructor:自动给所有 final 字段生成构造器\Spring 自动识别注入\ 不需要写任何构造器

/** * 用户 Controller */ @RestController @RequestMapping("/") @RequiredArgsConstructor // 关键 public class UserController { private final UserService userService; }

2、setter()注入

Setter 注入是通过类的 setter 方法来注入依赖,需要配合@Autowired注解使用(Spring 4.3+ 也可使用@RequiredArgsConstructor,但手动写 setter 更直观)。

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller // 补充Controller注解,确保Spring能扫描到该类 public class UserController { // 1. 仅定义私有变量,去掉final(setter注入不能用final,因为final变量必须在构造器/声明时赋值) private UserService userService; /** * Setter注入 * 2. 通过setter方法注入依赖,必须加@Autowired注解 */ @Autowired public void setUserService(UserService userService) { this.userService = userService; } }

3、字段注入

字段注入是直接在类的成员变量上标注@Autowired,无需构造器或 setter 方法,是最简洁的写法,但也是 Spring 官方不推荐的写法(不利于单元测试)。

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller public class UserController { // 1. 直接在字段上标注@Autowired,无需构造器/setter @Autowired private UserService userService; // 同样不能用final }

可选依赖和必选依赖判断标准(核心看「这个依赖缺失时,你的类 / 功能是否还能正常工作」—— 这不是技术规则,而是业务逻辑和功能设计决定)

类型

核心特征

典型场景

必选依赖

依赖缺失 → 类无法初始化 / 功能完全不可用

数据库 DAO、核心业务服务、配置中心

可选依赖

依赖缺失 → 类能正常工作,仅部分功能降级

缓存服务、日志增强、消息通知


IOC不是管理所有对象,只管【Bean】

✅ Spring IoC 容器 管:

被你加上这些注解的类:

  • @Controller—— 控制层
  • @Service—— 业务层
  • @Repository—— 数据层(Dao、Mapper)
  • @Component —— 通用组件(工具类、配置类、自定义组件等)
  • @Configuration 配置类
  • @Bean 方法返回的对象

这些叫 Bean,Spring 负责创建、注入、销毁。


❌ Spring IoC 容器 不管:

  • 实体类(User、Order、Product…)
  • VO / DTO / BO / POJO
  • 普通工具类对象
  • 方法内部临时创建的对象
  • new 出来的一切普通对象

这些不是 Bean,Spring 不负责,必须你自己 new。


http://www.jsqmd.com/news/461722/

相关文章:

  • 2026年苏州青少年篮球培训怎么选?这几家TOP机构值得关注!
  • Claude Code 隐藏功能大全:90%的人不知道这些
  • 150 万人被偷家之后,我翻了翻自己的 API Key 管理,冷汗直流
  • 帮朋友拆了一个机械臂问题,从误解到最优解
  • FFMPEG网络推流
  • 技术落地解析:深圳市兴通物联俄罗斯诚信标签条码比对系统,提升对俄出口合规效率
  • 2026年叔丁醇钾选购,江苏天泽新材料费用合理值得考虑 - myqiye
  • 跑步耳机挂脖好还是无线好?2026最适合跑步用的耳机真实体验分享
  • Python保护类内部私有变量,不允许外部类访问的一种简单实现
  • 口碑好的多肽修饰厂家2026年排行榜,哪家服务更贴心 - 工业推荐榜
  • OpenClaw本地私有化部署教程
  • 进口阀门市场发展趋势与工业应用解析
  • 矩阵论考题——答案
  • 和信通卡回收折扣对比2026,畅回收平台折脱颖而出 - 畅回收小程序
  • PbootCMS附件上传报错UNKNOW: Code: 8192; Desc: stripos()
  • 收藏!小白程序员必看:手把手教你玩转大模型上下文工程,提升代理智能
  • 亚马逊合规趋严,海外仓如何破解物流卡点,实现高效履约?
  • 2026年金华地区好用的日语高考培训学校排名 - mypinpai
  • docker安装nacos
  • 【金蝶云星空】如何给科目挂上核算维度
  • 本地ubuntu服务器上部署openclaw完整教程(详细图文)
  • 苏州小区停车场道闸系统推荐:智慧停车系统怎么选? - 品牌观察员小捷
  • 2026年全国气流粉碎机哪家好?实力筑牢精度与服务壁垒 一站式解决方案适配各类场景 - 深度智识库
  • 2026.03.10学习记录(游戏)
  • 【量化工具推荐】2026年国内期货量化软件年度排行
  • 2026年靠谱的全屋净水系统品牌推荐:全屋净水安装/全屋净水过滤系统优质供应商推荐参考 - 行业平台推荐
  • 2026年热门的塑料管夹厂家推荐:铝合金管夹/不锈钢管夹/轻型塑料管夹厂家实力与用户口碑参考 - 行业平台推荐
  • 抗老眼霜怎么选?2026抗皱淡黑消肿TOP5,成分效果性价比拉满 - 速递信息
  • 2026最强AI论文生成工具Top5_multimodal+global thought chain
  • 成都艺术涂料品牌品质商家