【学习笔记】IOC的推导及本质

IOC的推导及本质

 

1.IOC理论推导

原来要实现一个业务,需要 Service接口、ServiceImpl、Dao接口、DaoImpl

如下:

UserDao接口:

package com.wang.dao;
​
public interface UserDao {
    void getUser();
}

UserDaoImpl实现类:

package com.wang.dao;
​
public class UserDaoImpl implements UserDao{
​
    @Override
    public void getUser() {
        System.out.println("默认用户");
    }
}

UserService接口:

package com.wang.service;
​
public interface UserService {
    void getUser();
}

UserServiceImpl实现类:

package com.wang.service;
​
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
​
public class UserServiceImpl implements UserService{
​
    private UserDao userDao = new UserDaoImpl();
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

用户要实现这个业务,直接调用UserserviceImpl即可

但是,如果用户此时想要改变业务,输出“Spring用户”,需要在加一个UserDaoImpl,如果想要输出,就需要修改UserServiceImpl中的调用,业务每变一次,我们就要修改一次。

如下:

UserDaoSpringImpl实现类:

package com.wang.dao;
​
public class UserDaoSpringImpl  implements UserDao{
    @Override
    public void getUser() {
        System.out.println("Spring用户");
    }
}

UserServiceImpl实现类:

package com.wang.service;
​
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
import com.wang.dao.UserDaoSpringImpl;
​
public class UserServiceImpl implements UserService{
​
    private UserDao userDao = new UserDaoSpringImpl();
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

如果代码量十分大,这样无疑是十分繁琐的,所以我们可以利用set方法来实现值的动态注入

UserServiceImpl实现类:

package com.wang.service;
​
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
import com.wang.dao.UserDaoSpringImpl;
​
public class UserServiceImpl implements UserService{
​
    private UserDao userDao;
​
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
​
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

主程序:

import com.wang.dao.UserDaoSpringImpl;
import com.wang.service.UserService;
import com.wang.service.UserServiceImpl;
import org.junit.Test;
​
​
public class MyTest {
    @Test
    public void test01(){
​
        UserService userService = new UserServiceImpl();
        ((UserServiceImpl) userService).setUserDao(new UserDaoSpringImpl());
        userService.getUser();
    }
}

 

这样实现和之前的区别:

  • 之前是程序主动创建对象,控制权在程序员手中

  • 使用set注入后,程序不在有主动性,而是变成了被动接受对象

 

以上就是IOC的原型

 

2.IOC本质

控制反转 IOC 是一种设计思想,在没有IOC的程序中,对象的创建和对象的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后,将对象的创建交给第三方,所谓控制反转就是:获得依赖对象的方式反转了。

控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式,在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入

posted @ 2023-02-11 11:45  GrowthRoad  阅读(23)  评论(0编辑  收藏  举报