首页IT科技spring中bean的作用域有哪些?(Spring IOC官方文档学习笔记(五)之bean的作用域)

spring中bean的作用域有哪些?(Spring IOC官方文档学习笔记(五)之bean的作用域)

时间2025-05-05 03:07:43分类IT科技浏览5458
导读:1.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的配置如下

<beans ...> <!-- scope属性用于声明bean的作用域                  ,默认值即为singleton --> <bean id="exampleA" class="cn.example.spring.boke.ExampleA" scope="singleton"></bean> </beans>

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

基于xml的配置如下

<beans ...> <!-- scope属性用于声明bean的作用域--> <bean id="exampleA" class="cn.example.spring.boke.ExampleA" scope="prototype"></bean> </beans>

注意:最好对无状态的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时都让这个代理去获取实际对象并进行方法委托                  ,从而执行正确的方法调用

未完待续...

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
智慧农业物联网工程项目解决方案(基于物联网的智慧农业监测系统(前端界面有web端和微信小程序端))