ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring控制反转的理解-IOC的理解

2021-08-02 09:58:52  阅读:222  来源: 互联网

标签:UserServiceImpl UserDao Spring void 理解 new userDao IOC public


我们通过举一个小小的例子来说明什么是控制反转IOC?

初级阶段,我们写代码是这样的:

  1. 新建一个UserDao和它的实现类
public interface UserDao {
    void save();
}
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao.save");
    }
}
  1. 新建UserService接口,和它的实现类,调用UserDao,实现相应的业务
public interface UserService {
    void addUser();
}
public class UserServiceImpl implements UserService {
    //代码初级阶段,我们都是直接new一个UserDao实现类,然后调用它
    private UserDao userDao = new UserDaoImpl();

    public void addUser() {
        System.out.println("UserServiceImpl.addUser");
        userDao.save();
    }
}

初级阶段我们这样写代码会有一个严重的弊端!!!

  • Service层和Dao层的耦合性太高

  • 如果我们在增加其他的UserDao实现类,比如采用MySQL存储的MysqlUserDaoImpl,或者采用Oracle存储的UserDao实现类,就需要更改代码,这样做显然不切实际,我们总不能换一个UserDao实现类,就改一次代码

  • 什么叫耦合性?就是,我们在UserServiceImpl中直接new了一个具体的UserDao实现类,这时Service层和这个具体的UserDao关联了,如果这个UserDao被废用,整个代码就不能继续运行,需要重新更改代码;

下面我们增加一个MySqlUserDaoImpl:

public class MySqlUserDaoImpl implements UserDao {
    public void save() {
        System.out.println("MySqlUserDaoImpl.save:采用mysql实现数据库存储");
    }
}
  • 这样我们就要更改我们的Service层代码,new一个新的实现类
public class UserServiceImpl implements UserService {
    private UserDao userDao = new MySqlUserDaoImpl();

    public void addUser() {
        System.out.println("UserServiceImpl.addUser");
        userDao.save();
    }
}

注意:重点!!

  • 这时,我们将创建userDao的权利交给了程序,在运行的时候,由程序来创建userDao,而不受我们程序员的控制(就是我们想创建哪个UserDao,就创建哪个)

下面我们给UserService向外提供一个接口,实现程序员控制UserDao的创建:

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    //我们通过增加一个set方法,用户可以传递一个userDao进来,然后赋值给UserDao
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void addUser() {
        System.out.println("UserServiceImpl.addUser");
        userDao.save();
    }
}

像这种通过set方法给UserDao赋值的过程就叫依赖注入DI
测试

@Test
public void test1() {
    UserService userService = new UserServiceImpl();
    userService.setUserDao(new MySqlUserDaoImpl());
    userService.addUser();
}

或许你还会感觉,这样还是由程序来创建具体的UserDao,确实上面的代码,还是受到程序控制

这样我们给它加一个switch判断,就更明显了

@Test
public void test1() {
    UserService userService = new UserServiceImpl();
    int i = 1;
    switch (i){
        case 0:
            userService.setUserDao(new UserDaoImpl());
            break;
        case 1:
            userService.setUserDao(new MySqlUserDaoImpl());
            break;
    }
    userService.addUser();
}

这时我们就可以通过键盘输入,来控制对象的创建

这样的话,我们就可以实现由程序员(用户)来创建具体的UserDao实现类

  • 这样的,将创建对象的权利交给用户,而不是程序的过程就叫控制反转(IOC);

  • 控制反转的关键在于,我们在代码中不直接实例化具体的对象,而是在运行期间交由用户动态产生;向外提供接口,供外部传递参数;也可以通过动态代理的方法实现

以上就是我对控制反转IOC的理解

标签:UserServiceImpl,UserDao,Spring,void,理解,new,userDao,IOC,public
来源: https://blog.csdn.net/qq_44704799/article/details/119317919

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有