Spring IoC&DI

发布于:2025-06-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、Spring家族

Spring = 超级工厂(管理对象生命周期)
Spring MVC = 快递小哥(处理HTTP请求/响应)
Spring Boot = 智能工具箱(一键集成全家桶)

📦 类比

  • Spring是汽车发动机(动力核心)

  • Spring MVC是方向盘+油门(控制方向)

  • Spring Boot是自动驾驶系统(简化操作)


二、IoC:颠覆传统的控制艺术

传统开发(自己造车):

Car car = new Car();  // 亲手造发动机  
car.run();  

IoC模式(4S店提车):

Car car = Spring容器.getBean(Car.class); // 直接开走  
car.run();  
控制权 维护成本
传统 程序员掌控
IoC Spring容器

💡 生活比喻

  • 传统开发 → 自己种菜做饭

  • IoC → 点外卖(容器送餐上门)


三、DI:依赖注入的三种姿势 💉

1. 属性注入(最常用)

@Autowired  
private UserService userService;  // 简单粗暴  

2. 构造器注入(Spring官方推荐✅)

@Autowired  
private UserService userService;  // 简单粗暴  

3. Setter注入(灵活调整)

private UserService userService;  

@Autowired  
public void setUserService(UserService userService) {  
    this.userService = userService; // 随时更换  
}  

⚠️ 避坑指南

  • final属性 → 选构造器注入

  • 避免循环依赖 → 别让A依赖B,B又依赖A


四、Bean管理的核心技巧 🎯

1. 五大存储注解

@Controller   // 接请求 → 如前台接待  
@Service      // 处理业务 → 如厨师  
@Repository   // 操作数据 → 如仓库管理员  
@Component    // 通用组件 → 如万能工具人  
@Configuration // 配置类 → 如产品说明书  

2. 解决Bean冲突

@Primary // 默认首选(正宫娘娘)  
public class MySQLService {}  

@Qualifier("oracle") // 点名要Oracle(指定小名)  
@Autowired  
private DatabaseService oracleService;  

@Resource(name="postgres") // JDK原生点名(带身份证)  
private DatabaseService pgService;  

🔍 Bean命名潜规则

  • UserService → userService(首字母小写)

  • APIClient → APIClient(前两个字母大写则保留原名)


五、IoC容器工作原理 🧩

1. 存Bean

UserService service = context.getBean(UserService.class);  
  • 类上加@Component等注解 → 标记为"可托管对象"

2. 取Bean

// 从Spring容器拿对象  
UserService service = context.getBean(UserService.class);  

3. 依赖注入

  • 容器自动把UserService塞进UserController的属性中

🌰 造车比喻
传统:自己造轮胎→装底盘→造车身→组装汽车(牵一发动全身)
IoC:工厂提供轮胎、底盘、车身 → 你只需说"我要一辆车"


六、最佳实践心得 💎
  1. 构造器注入 > 属性注入

    • 支持final属性(线程安全)

    • 避免NPE(空指针异常)

  2. 分层注解 > 通用@Component

    • @Controller:门面担当(接待用户)

    • @Service:业务核心(处理逻辑)

    • @Repository:数据专家(操作数据库)

  3. 启动类位置 = 扫描起点

    com.example  
    ├── Application.java  // 启动类(扫描这里开始)  
    ├── controller        // 自动扫描 ✅  
    └── service           // 自动扫描 ✅  

✨ 黄金法则
当你准备new一个对象时
先问问Spring:能不能帮我管?


总结:IoC/DI带来的蜕变 🦋

传统开发 Spring模式
紧耦合(修改成本高) 松耦合(修改局部)
手动管理对象 自动托管对象
重复造轮子 专注业务逻辑

最终效果

  • 代码量⬇️ 

  • 维护效率⬆️

  • 程序员幸福感💖爆棚


网站公告

今日签到

点亮在社区的每一天
去签到