2. IOC
- 控制反转IOC(Inversion of Control),是一种设计思想, DI (依赖注入)是实现IOC的一种方式
- 没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制。
- 控制反转后将对象创建转移给第三方,所谓的控制反转就是 获得依赖对象的方式反转了;
以前写代码:
-
UserDao
public interface UserDao { void getUser(); }
-
UserDaoImpl
public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("查询用户信息!"); } }
-
UserService
public interface UserService { void getUser(); }
-
UserServiceImpl
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
-
测试
public class MyTest { public static void main(String[] args) { //用户实际调用的是业务层,dao层不需要接触 UserService userService = new UserServiceImpl(); userService.getUser(); } }
-
结果
如果需求发生了变化,需要扩展其他功能, 那么就需要每次修改源代码
-
UserDaoOrecleImpl(新增功能)
public class UserDaoOracleImpl implements UserDao{ @Override public void getUser() { System.out.println("Oracle获取用户数据"); } }
-
UserDaoSqlServerImpl(新增功能)
public class UserDaoSqlServerImpl implements UserDao{ @Override public void getUser() { System.out.println("SqlServer获取用户数据"); } }
-
每次修改需求就需要修改Service层源代码:
public class UserServiceImpl implements UserService{ //修改 private UserDao userDao = new UserDaoSqlServerImpl(); @Override public void getUser() { userDao.getUser(); } }
那么有什么方法可以解决呢?
-
给service层添加set功能,将控制权交给调用者
public class UserServiceImpl implements UserService{ private UserDao userDao = new UserDaoImpl(); //利用set动态的实现值的注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }
-
那么即可在调用层面上解决频繁修改源代码的问题
public class MyTest { public static void main(String[] args) { UserService userService = new UserServiceImpl(); // 传入要使用的新功能类就可以了 userService.setUserDao(new UserDaoSqlServerImpl()); userService.getUser(); } }
或:
public class MyTest { public static void main(String[] args) { UserService userService = new UserServiceImpl(); // 传入要使用的新功能类就可以了 userService.setUserDao(new UserDaoOracleImpl()); userService.getUser(); } }
-
结果
以上即使IoC的原型
- 之前,程序是主动创建对象,控制权在程序员手上
- 使用set注入后,程序不再具有主动性,而变成了被动的接受对象
控制反转(IoC)是一种思想,这种思想,从本质上解决了问题,我们程序员不用再取管理对象的创建了,系统的耦合性大大降低,可以更加专注的在业务的实现上。
控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。 在Spring中实现控制反转的是Ioc容器,实现方法是依赖注入(Dependency Injection, DI)。
学习笔记,如有错误,请多多指正!