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容器中取出需要对象

    

posted @ 2021-11-16 19:31  qwedfrgh  阅读(50)  评论(0)    收藏  举报