ICode9

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

如何理解spring ioc

2020-01-29 10:00:12  阅读:218  来源: 互联网

标签:容器 UserServiceImpl 对象 spring 齿轮 理解 反转 ioc


什么是ioc

ioc全称是【Inversion of Control】控制反转,按照字面意思理解,将控制反转过来,这里的控制指的是什么,为什么要进行反转,ioc可以解决什么问题?要回答这些问题,我们需要先了解一下ioc为什么会产生

为什么要有ioc

java是一门面向对象的语言,我们的应用程序通过一个个对象之间的相互关联和作用来完成功能,在网上看到一个特别形象的比喻,这里借用一下:

image.png


这里的每一个齿轮代表一个对象,对象之间彼此紧密咬合形成一个系统,这样的系统对象之间的耦合度非常高,所谓的耦合度就是关系的紧密程度,高耦合度带来的问题显而易见,只要有一个齿轮发生故障,其它齿轮也无法工作,进而整个系统都无法正常工作,这种牵一发而动全身情况如何才能改善呢?看下图:

image.png

中间这个齿轮好比一个粘合剂将其它几个齿轮粘合起来,所有的齿轮都交由中间这个齿轮管理,试着把中间这个齿轮拿掉我们可以看到这三个齿轮之间彼此毫无关系,即使一个齿轮出了故障,也不会影响到其它齿轮,中间这个齿轮就好比ioc容器,其它齿轮就是对象,可以看出引入了ioc容器,对象之间的耦合度降低了。当我们修改一个对象的时候不需要去考虑其它对象,因为它不会对其它对象造成影响。

ioc的原理

这里说到的ioc容器到底是个什么东东,又是什么让它具有如此神奇的力量?

先来看一下没有ioc容器的时候,对象A依赖对象B,A在运行到某一时刻的时候会去创建B的对象,在这里A具有主动权,它控制了对象B的创建。

引入ioc以后对象A和对象B之间没有了直接联系,当A运行的时候由ioc容器创建B对象在适当的时候注入到A中,在这里,控制权由A对象转移到了ioc容器。这也就是控制反转名称的由来。

看一个例子:

public class UserServiceImpl {
    private UserDao userDaoImpl
    public List<User> getAllUser(){
        userDaoImpl new UserDaoImpl();
        return userDaoImpl.getAllUser();

}
}

这里UserServiceImpl依赖UserDaoImpl,需要在UserServiceImpl中创建UserDaoImpl对象,对象之间的耦合性很高,如何解耦呢?

我们可以通过反射来解耦,反射可以根据类的全限定名在程序运行时创建对象,可以这样做,将类的全限定名配置在xml文件中,在程序运行时通过反射读取该类的全限定名,动态的创建对象,赋值给userDao接口userDaoImpl.这样做后UserServiceImpl和UserDaoImpl之间没有了直接的关系,当我们需要替换UserDaoImpl对象的时候只需要在配置文件中去修改类的全限定名就可以了,非常的灵活方便,ioc容器的实现就是这个原理。

Ioc容器可以自动的帮我们完成以上一系列操作,我们需要做的就是通过配置文件告诉ioc需要创建哪个类以及类和类之间的关系。

 

控制反转和依赖注入

在这里需要提到一个概念依赖注入,很多初学者搞不清楚控制反转和依赖注入之间的关系,其实他们是对同一事务的不同角度的描述。

控制反转是一种设计思想而依赖注入是这种思想的具体实现

具体说控制反转就是将创建userDaoImpl对象的控制权反转过来由UserServiceImpl交给了ioc容器,强调的是一种能力和思想,ioc容器具有了控制权。

依赖注入就是ioc容器将UserServiceImpl所依赖的对象userDaoImpl,注入给UserServiceImpl,强调的是一个过程和实现


标签:容器,UserServiceImpl,对象,spring,齿轮,理解,反转,ioc
来源: https://blog.51cto.com/11583017/2468539

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

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

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

ICode9版权所有