IOC理论推导
以前:
-
UserDao接口
package com.faq.dao; public interface UserDao { void getUser(); }
-
UserDaoImpl实现类
package com.faq.dao; public class UserDaoImpl implements UserDao{ public void getUser(){ System.out.println("默认获取用户的数据"); } }
package com.faq.dao; public class UserDaoMysqlImpl implements UserDao{ public void getUser() { System.out.println("Mysql获取用户数据"); } }
-
UserService业务接口
package com.faq.service; public interface UserService { void getUser(); }
-
UserServiceImpl业务实现类
package com.faq.service; import com.faq.dao.UserDao; import com.faq.dao.UserDaoImpl; import com.faq.dao.UserDaoMysqlImpl; //业务层调Dao层 public class UserServiceImpl implements UserService { private UserDao userDao=new UserDaoImpl();//组合 private UserDao userDao1=new UserDaoMysqlImpl(); public void getUser() { userDao1.getUser(); } }
-
测试类
import com.faq.dao.UserDao; import com.faq.dao.UserDaoImpl; import com.faq.service.UserService; import com.faq.service.UserServiceImpl; public class MyTest { public static void main(String[] agrs){ //用户实际调用的是业务层,dao层不需要接触 UserServiceImpl userService = new UserServiceImpl(); userService.getUser(); } }
再上述的业务中,用户的需求可能会影响我们原来的代码(UserServiceImpl中调用dao层创建不同的对象),我们需要根据用户的需求去修改原代码!程序量巨大时修改成本高
使用set接口实现
public class UserServiceImpl implements UserService {
private UserDao userDao;
//利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
测试
public class MyTest {
public static void main(String[] agrs){
//用户实际调用的是业务层,dao层不需要接触
UserServiceImpl userService = new UserServiceImpl();
//userService.setUserDao(new UserDaoMysqlImpl());
userService.setUserDao(new UserDaoImpl());
userService.getUser();
}
}
- 之前,程序是主动创建对象!控制权在程序猿手上
- 使用set注入后,程序员不在具有主动性,而是变成被动的接受对象
这种思想,本质上解决了问题,程序员不用再去管理对象的创建。系统耦合性大大降低,可以更专注于业务的实现!这是IOC(控制反转)的原型