0
点赞
收藏
分享

微信扫一扫

IOC理论推导

念川LNSC 2022-05-01 阅读 76
spring

IoC基础
先写个UserDao接口

public interface UserDao {
    void getUser();
}

UserDaoImpl

public class UserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取用户");
    }
}

UserService

public interface UserService {
    void getUser();
}

UserServiceImpl

import com.wx.dao.UserDao;
import com.wx.dao.UserDaoImpl;

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

测试

import com.wx.service.UserService;
import com.wx.service.UserServiceImpl;

public class MyTest {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.getUser();
    }
}

在这里插入图片描述
但如我们增加一个用户接口实现类

public class UserDaoMysql implements UserDao{
    @Override
    public void getUser() {
        System.out.println("mysql获取用户");
    }
}

如果我们要使用这个接口实现类的花,我们就需要去service里修改代码

package com.wx.service;

import com.wx.dao.UserDao;
import com.wx.dao.UserDaoImpl;
import com.wx.dao.UserDaoMysql;

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

在这里插入图片描述
如果我们再继续加接口实现类,那么又要对应地去修改service实现类里面的代码,如果这种需求非常大,那么就要修改大量的代码,这种设计耦合性太高了。
解决:
我们可以在需要用到他的地方 , 不去实现它 , 而是留出一个接口 , 利用set , 我们去代码里修改下 .

package com.wx.service;

import com.wx.dao.UserDao;
import com.wx.dao.UserDaoImpl;
import com.wx.dao.UserDaoMysql;

public class UserServiceImpl implements UserService{
    private UserDao userDao ;

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

    @Override
    public void getUser() {
        userDao.getUser();
    }
}
import com.wx.dao.UserDaoImpl;
import com.wx.dao.UserDaoMysql;
import com.wx.service.UserService;
import com.wx.service.UserServiceImpl;

public class MyTest {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoMysql());
        userService.getUser();
    }
}

这样我们就可以通过使用setUserDao来实现不同的接口实现类,这样就解决了问题,降低了耦合性,这也就是IoC的原型

IoC本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现
控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

举报

相关推荐

0 条评论