这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【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
六.更多讨论
更多内容,可以加入IT交流群565734203与大家一起讨论交流
这里是技能树·IT修真院:nofollow">https://www.jnshu.com,初学者转行到互联网的聚集地
原文链接:https://www.f2er.com/spring/67457.html