最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天通讯!Spring IOC官方文档学习笔记(五)之bean的作用域

来源:博客园


(资料图)

1.Bean的作用域

(1) Bean的作用域即Bean实例的作用范围,Spring支持6种bean的作用域,其中4种只能在web环境中使用,具体如下

作用域描述
singleton默认作用域,采用单例模式,Spring只会创建一个该bean实例,每次请求时Spring返回的都是同一个bean实例
prototype采用原型模式,Spring会创建多个该bean实例,每次请求时Spring返回的都是一个新的bean实例
request仅用于web环境,Spring会为每次Http请求创建一个新的bean实例
session仅用于web环境,Spring会为每个Session创建一个新的bean实例
application仅用于web环境,Spring会为每个ServletContext创建一个新的bean实例
websocket仅用于web环境,Spring会为每个websocket创建一个新的bean实例

(2) Singleton作用域:如果一个bean的作用域为singleton,那么Spring只会创建出一个该bean实例存储于IOC容器中,之后每次对这个bean的请求都只会返回容器中的那个特定的bean实例,换句话说,对该bean请求返回的结果都是相同的,如下图

基于xml的配置如下

        

(3) Prototype作用域:如果一个bean的作用域为prototype,那么我们每次对这个bean的请求都会导致Spring会为我们创建出一个全新的bean实例并返回,换句话说,对该bean请求返回的结果都是不同(全新)的,如下图

基于xml的配置如下

        

注意:最好对无状态的bean采用singleton模式,而对有状态的bean采用prototype模式,此外,与其他作用域的bean相比,Spring不会管理prototype bean的完整生命周期,即Spring只管prototype bean的创建,不管它的销毁,prototype bean的初始化回调会被Spring调用,但它的销毁回调却不会,因此,我们在使用prototype bean时,必须清理其所拥有的资源,防止内存泄漏(清理方式:通过自定义bean后置处理器)

(4) request,session,application与websocket这4种作用域只能在web环境中使用,否则会抛出异常,此外,如果当前的servlet环境是Spring MVC环境且请求均通过DispatcherServlet进行处理,那么无需任何其他配置,直接就可以使用这4种作用域,否则,需要进行一些特殊的配置,具体可参考官方文档,此处略

(5) 当我们想要将一个短作用域(例如:request)的bean注入到一个长作用域(例如:singleton)的bean中时,可选择注入这个短作用域bean的AOP代理对象,这是因为通常容器只初始化一次,因此singleton bean的依赖项也只会被注入一次,从而我们所获得的依赖项至始至终都是相同的,在这种情况下,我们就需要一个代理对象,在每次http request时都让这个代理去获取实际对象并进行方法委托,从而执行正确的方法调用

未完待续...

关键词: 一个新的 生命周期 这是因为