一、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:工厂提供轮胎、底盘、车身 → 你只需说"我要一辆车"
六、最佳实践心得 💎
构造器注入 > 属性注入
支持
final
属性(线程安全)避免NPE(空指针异常)
分层注解 > 通用@Component
@Controller
:门面担当(接待用户)@Service
:业务核心(处理逻辑)@Repository
:数据专家(操作数据库)
启动类位置 = 扫描起点
com.example ├── Application.java // 启动类(扫描这里开始) ├── controller // 自动扫描 ✅ └── service // 自动扫描 ✅
✨ 黄金法则:
当你准备new
一个对象时
先问问Spring:能不能帮我管?
总结:IoC/DI带来的蜕变 🦋
传统开发 | Spring模式 |
---|---|
紧耦合(修改成本高) | 松耦合(修改局部) |
手动管理对象 | 自动托管对象 |
重复造轮子 | 专注业务逻辑 |
最终效果:
代码量⬇️
维护效率⬆️
程序员幸福感💖爆棚