SpringIOC理论推导

发布时间 2023-04-23 17:29:38作者: 小凡不会敲代码

IOC理论

引入

原来实现业务的步骤:

  1. Dao层接口
  2. Dao层实现类
  3. Service层接口
  4. Service层实现类

eg:

  1. Dao层接口

    public interface UserDao {
        void getUser();
    }
    
  2. Dao层实现类

    public class UserDaoImpl implements UserDao{
        public void getUser() {
            System.out.println("获取用户,此方法为:Dao层方法");
        }
    }
    
  3. Service层接口

    public interface UserService {
        void getUser();
    }
    
  4. Service层实现类

    public class UserServiceImpl implements UserService{
        private UserDao userDao = new UserDaoImpl();
    
        public void getUser() {
            userDao.getUser();
        }
    }
    

在service的实现类中引入Dao,在由Dao在service中调用相应的方法。

现在我们增加一个需求:增加其他的实现。

具体实现步骤:

  1. 新增Dao层实现类
  2. 在service中引入Dao层,并调用相应的方法

eg:

  1. 新增Dao层实现类

    public class UserDaoMysqlImpl implements UserDao{
        public void getUser() {
            System.out.println("获取用户,此方法为:UserDaoMysqlImpl中的方法");
        }
    }
    
  2. 在service中引入Dao层,并调用相应的方法

    这时候就会发生一个问题,如果用户想要访问到新增加的这个Dao层的东西,就必须修改Service层中实现类中的代码,将新的Dao层实现类对象引入到Service层中。

    即:

    private UserDao userDao = new UserDaoImpl();
    //将下述代码替换上述代码
    private UserDao userDao = new UserDaoMysqlImpl();
    

    用户每次调用一个新的业务都需要修改Service层中的代码,显然这样在显示的业务中是不可取的。那么如何解决这类问题呢?

可以使用set方法实现动态的改变Service实现类中Dao的改变。

private UserDao userDao;

public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}

向上述这样。这样的话用户就可以根据自己的需求动态的进行改变。

eg:

    @Test
    public void test(){
        UserService userService = new UserServiceImpl();
        UserDaoImpl userDao = new UserDaoImpl();
        UserDaoMysqlImpl userDaoMysql = new UserDaoMysqlImpl();
        ((UserServiceImpl) userService).setUserDao(userDaoMysql);//这里用户可以根据自己的需求动态的对Dao层进行注入。
        userService.getUser();
    }

总结:

  • 之前,程序是主动进行创建的,控制权程序猿手中。
  • 使用set方法以后,程序失去了主动性变成了被动的接受对象!!!!
  • 这种思想从本质上解决了问题,我们作为开发人员不需要在去管理对象的创建了。这样大大降低了系统的耦合性,可以更加专注与业务的实现。这就是IOC的原型!!!!!

本质

​ 控制反转IOC(Inversion Of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有一种说法是DI是IOC的另一种说法。在没有IOC的程序中对象的创建完全硬解码在程序中(写死在程序中),对象的创建由程序自己控制,使用了控制反转以后将对象的创建转移给第三方,所以个人认为所谓控制反转就是获取对象的方式发生了反转。

用图形表示如下:

IOC是Spring框架的核心,可以使用多种方式完美的实现IOC,eg:XML配置文件,注解,甚至可以零配置实现IOC