IOC控制反转思路
以下面的例子来简单说一下控制反转的思想
原先的实现思路的例子:新建一个UserDao接口,有一个getUser()方法;
这个几口有2个实现类,一个是UserDaoMysqlImpl一个时UserDaoOracleImpl代码如下
//mysql public class UserDaoMysqlImpl implements UserDao{ public void getUser() { System.out.println("这是Mysql的实现方法"); } } //oracle public class UserDaoOracleImpl implements UserDao{ public void getUser() { System.out.println("这是Oracle的实现方法"); } }
写一个service层的接口和实现类,调用Dao层

写一个测试类。来模拟用户调用Service层的实现代码如下
当我们实现了mysql的调用,想要去实现Oracle的实现时候,要在Service层去修改。如上图所示
修改Service代码,代价比较大
public class Mytest { public static void main(String[] args) { //用户实际调用的是业务层,dao层不会调用 UserService userService=new UserServiceImpl(); userService.getUser(); } }
这时候想到了IOC控制反转,优化service的代码,可以实现让用户去决定调用mysql或者oracle的实现
修改方法:优化service层的实现方法,将原来写死的dao测的实现,使用Set。使用set的注入思想。优化service代码和实现代码如下。

可以在用户层,用户来决定调用哪个实现。不用再去修改service层!
之前代码主动创建对象,主动权在程序员手里。修改后的程序不具备主动性,被动的接受用户传值,service层变成了被动接收。
public class Mytest { public static void main(String[] args) { //用户实际调用的是业务层,dao层不会调用 UserService userService=new UserServiceImpl(); //用户层通过set来决定调用哪个实现 // ((UserServiceImpl) userService).setUserdao(new UserDaoMysqlImpl()); ((UserServiceImpl) userService).setUserdao(new UserDaoOracleImpl()); userService.getUser(); } }
IOC的本质:
之前代码中的对象都是我们new出来的,程序主动创建依赖对象
现在将生成对象的控制权交给第三方(容器)即:IOC控制反转就是获取依赖对象的方式反转了
IOC是Spring框架的核心内容
Spring容器会在初始化代码时读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时候再从IOC容器中取出需要对象

浙公网安备 33010602011771号