谈谈对Spring 容器的理解
今天为什么要谈这个问题呢?因为昨天有个同事突然找我了解Springboot 启动加载流程的时候,提到了什么是Spring 容器?
当时我的第一反应是Spring 容器是存放各种bean的地方,即项目启动时会实例化和初始化相关的bean对象,然后将初始化好的bean放到Spring 容器中,并且在项目启动的时候bean的各种依赖关系也会初始化在Spring容器中。然后当项目在运行的时候,某个方法用到某个bean的对象时,就直接去Spring 容器中拿过来用,而不是再去堆内存中,再new一个对象出来。
那Spring容器这样实现有什么好处呢?或者说为什么要这样实现呢?
我联想到自己实现的项目都是为了http请求获取数据或者增加、修改、删除数据的接口请求服务的。最终这个请求进入了我们的应用的某个方法,开始进行业务逻辑操作,如果这时候没有Spring 容器的话,它需要创建和装配各种类的对象装载和加工数据、数据处理完成后又要创建和装配各种和数据库持久层相关的对象去增删查改数据。
毫无疑问,这套流程下来,涉及到大量对象的创建销毁流程,太耗时(开发时间增加)耗财(跑应用的服务器cpu和资源需要增加,还会增加内存泄漏的风险)了。
所以后面引入pring 容器来创建、装配、销毁对象,就说的通了。
那么Spring 容器的创建、装配、销毁又是如何实现的呢?
这需要看Spring中的bean的生命周期
spring中的生命周期有比如:singleton,prototype,session,request…
Spring 中的Bean默认是singleton
singleton(全局的)是随着spring的存亡而存亡
GC回收原则,当bean的引用没有指向任何地方的时候,它就会被回收
spring中的singleton 存在于ioc 中,本身就是单例,是基于spring的上下文的,当spring本身不消失,自然ioc容器也不会消失,自然ioc容器中的引用也会一直被持有,那么自然spring中的bean也就不会被回收会一直存在
prototype 又叫多例模式,用的时候就new一下,用完就没有了。
session 存在这一次会话 session 中,session没有过期它就一直存在,session过期后它就没了。
request 存在这一次请求中,请求结束了它就结束。
参考理解:
控制反转:总之一句话,我的应用程序里不用再过问对象的创建和管理对象之间的依赖关系了,都让IOC容器给代劳吧,也就是说,我把对象创建、管理的控制权都交给Spring容器,这是一种控制权的反转,所以Spring容器才能称为IOC容器。
在网上扩展阅读的时候,读到了下面这段话,有点启发,摘录下来
容器的概念在java中你最熟悉的莫过于Tomcat了,它正是一个运行Servlet的web容器,而Spring要想实现依赖注入功能,就离不开对象生产的容器——如果没有容器负责对象的创建管理,你的程序代码只是喊要对象了,Spring也无处给你啊。实际上,容器是Spring框架实现功能的核心,容器不只是帮我们创建了对象那么简单,它负责了对象整个的生命周期的管理——创建、装配、销毁。
参考:
https://mp.weixin.qq.com/s/tto18MtKLfu_fvF6nCDGiA
https://blog.csdn.net/qq_37699336/article/details/115757211

浙公网安备 33010602011771号