简述
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
详述
1. 原始实现方式的问题
在你最初的代码中:
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl(); // 或者 UserDaoMySqlImpl、UserDaoOracleImpl
@Override
public void getUser() {
userDao.getUser();
}
}
问题分析:
- 硬编码问题:
UserServiceImpl
中直接实例化了UserDaoImpl
或其他实现类,导致代码与具体实现类强耦合。 - 扩展性差:如果需要新增一个
UserDao
实现类(如UserDaoOracleImpl
),必须修改UserServiceImpl
的代码。 - 维护成本高:每次需求变更都需要修改源代码,违反了开闭原则(对扩展开放,对修改关闭)。
2. 解决方案:通过 Set 方法注入依赖
通过引入 Set 方法,将依赖的创建和注入交给外部调用者,而不是让 UserServiceImpl
自己去管理依赖对象的创建。
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 使用 Set 方法注入依赖
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void