2.IOC 控制反转
这是一个过程,在此过程中,对象仅通过构造函数参数,工厂方法的参数或在构造从工厂方法返回后在对象实例上设置的属性来定义其依赖项(即,与它们一起使用的其他对象) 。然后,容器在创建bean时注入那些依赖项。从本质上讲,此过程是通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖关系的实例化或位置的Bean本身的逆过程(因此,其名称为Control Inversion)。
引入的原因
在之前的开发当中 , 用户的需求可能会需要修改原来的代码 , 如下例
-
dao层
-
BaseDao接口
public interface BaseDao { void work(); }
-
BaseDaoMysqlImple 实现类
public class BaseDaoMysqlImple implements BaseDao { @Override public void work() { System.out.println("使用Mysql实现"); } }
-
BaseDaoOracleImple 实现类
public class BaseDaoOracleImple implements BaseDao { @Override public void work() { System.out.println("使用Oracle实现"); } }
-
-
service层
-
BaseService接口
public interface BaseService { void serviceWork(); }
-
BaseServiceImpl实现类
public class BaseServiceImpl implements BaseService { private BaseDao baseDao; @Override public void serviceWork() { baseDao = new BaseDaoMysqlImple(); baseDao.work(); } }
-
-
测试
public class BaseTest { @Test public void test() { BaseService baseService = new BaseServiceImpl(); baseService.serviceWork(); //在这个例子中,结果是 "使用Mysql实现" //如果我们想使用Oracle实现 ,会发现在这个层面无法进行操作,需要修改BaseServiceImpl的实现 } }
显然在以上的例子中,如果用户有不同的实现需求 , 我们会不断地更改已经写好的代码,这显然对软件开发来说是糟糕的,那么如何解决这种问题呢?
在ServiceImpl中添加一个用户可以自主控制的方法
public class BaseServiceImpl implements BaseService { private BaseDao baseDao; public void setBaseDao(BaseDao baseDao) { this.baseDao = baseDao ; } @Override public void serviceWork() { if(this.baseDao != null) { this.baseDao.work(); } else { System.out.println("您未指定实现方式"); } } }
public class BaseTest { @Test public void test() { //我们发现因为加入了setBaseDao方法 , 可以在 test()中直接进行实现方式的修改 BaseServiceImpl service = new BaseServiceImpl(); service.setBaseDao(new BaseDaoOracleImple()); service.serviceWork(); } }
之前 ,程序是主动创建对象 ,控制权在开发者手上(开发者需要手动修改)
现在 ,程序变为了被动接受对象 ,主动权在用户受伤。只需要获取对应参数即可 (开发者只需要写一次代码,之后自动修改实现方式即可)
开发者不用再去管理对象的创建 , 系统的耦合性大大降低 , 开发者只需要**用心实现业务即可 **,即IOC原型
普通面向对象开发
IOC开发
IOC的本质
控制反转(IOC Inversion of Control)是一种设计思想 , (DI)依赖注入 是实现IOC的一种方法
IOC是Spring的核心内容 , 可以使用XML配置 、注解配置等多种方式实现IOC