加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?

发布时间:2020-12-15 01:53:47 所属栏目:大数据 来源:网络整理
导读:这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例? 】

Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?

一.背景介绍

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring的核心是控制反转(IoC)和面向切面(AOP)。

二.知识剖析

什么是反转控制(IOC)?

是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“

第三方”实现具有依赖关系的对象之间的解耦。

通过控制反转客户端不需要再主动创建对象,只需要通过IOC,由IOC去创建就可以了

由应用程序创建对象转变为由IOC容器来创建,用于控制创建对象的主体发生了改变,这是控制反转

应用程序需要的对象信息由IOC容器创建后注入,也就是说依赖于容器来注入,这是依赖注入

表达的是一个东西,只是描述的角度不同。

IOC,从容器的角度出发,容器反向控制应用程序对象的创建。

DI,从应用程序的角度出发,应用程序需要依赖容器注入对象。

三.常见问题

理解好IoC的关键是:谁控制谁,控制什么了,为何是反转,在哪些方面反转了。

谁控制谁,控制什么了

传统JavaSE程序设计,我们在对象内部直接通过new进行创建对象,是程序主动去创建依赖对象,而IoC有一个专门的容器来创建这些对象,即由IoC容器来创建这些对象的创建。谁控制谁?当然是由IoC容器控制了对象;控制了什么?那就主要是控制了外部资源获取(包括对象、文件等)。

为何是反转,在哪些方面反转了

有反转就有正转。传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转。而反转则是由容器来帮忙创建及注入依赖对象。为何是反转?因为容器帮我们查找和注入依赖对象,对象只是被动的接受依赖对象,所以是反转。哪些方面反转了?依赖对象的获取反转了。

理解DI的关键:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么

1.谁依赖谁?当然是应用程序依赖于IoC容器。?

2.为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源(包括对象,文件等)。?

3.谁注入谁?很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象。?

4.注入了什么?就是注入某个对象所需要的外部资源(包括对象、资源、变量数据)

四.扩展和思考

spring中Bean的五个作用域

当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:

singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例

prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效

globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。

  如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

五.参考文献

https://www.cnblogs.com/goody9807/p/7472127.html

https://blog.csdn.net/weixin_41776493/article/details/80035932

六.更多讨论

PPT链接?视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:,初学者转行到互联网的聚集地

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读