Spring IoC 容器,控制反转

让我通过一个具体的例子来说明控制反转(IoC)是如何"反转"的。

在传统编程中(没有 IoC 之前):

public class UserService {
    // UserService 直接创建 UserDao
    private UserDao userDao = new UserDaoImpl();
    
    public User getUser(Long id) {
        return userDao.findById(id);
    }
}

使用 Spring IoC 之后:

public class UserService {
    // UserDao 由容器注入,不再由 UserService 创建
    @Autowired
    private UserDao userDao;
    
    public User getUser(Long id) {
        return userDao.findById(id);
    }
}

这里的"反转"体现在三个方面:

  1. 控制权的反转
    • 传统:对象的创建和依赖关系由开发者在代码中直接控制
    • IoC:对象的创建和依赖关系交给 Spring 容器来控制
  2. 依赖方式的反转
    • 传统:组件主动去创建依赖的对象
    • IoC:组件被动等待容器注入依赖的对象
  3. 依赖查找方式的反转
    • 传统:组件主动去查找它依赖的对象
    • IoC:容器将依赖对象主动注入到组件中

IoC 的好处:

  1. 降低代码耦合度
  2. 更容易进行单元测试(可以方便地注入 mock 对象)
  3. 更好的模块化
  4. 更容易替换组件的实现

这种反转对开发的影响:

// 配置类
@Configuration
public class AppConfig {
    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
    
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

通过这种方式,我们可以:

  1. 在配置文件中轻松更换实现类
  2. 统一管理对象的生命周期
  3. 方便地配置对象的作用域
  4. 实现 AOP 等高级特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值