spring ioc容器bean scope文档阅读

This commit is contained in:
wuxiangkai
2023-10-23 14:09:31 +08:00
parent 5f2fc404c2
commit 670539a025

View File

@@ -9,3 +9,40 @@
当创建一个singleton bean定义时spring容器会为该bean定义创建一个实例该单实例会存储在cache中该cache专门用于存储类似的单实例对象。所有针对单实例对象的请求都会返回该cache中的对象。
singleton scope并不代表针对特定类型只创建一个实例对象。singleton scope代表在同一个容器中只会存在一个该类型的bean对象。
### Prototype Scope
对于prototype scope的bean对象每次请求该bean对象时都会创建一个新的bean实例。
故而应该对拥有状态stateful的bean对象使用prototype scope而对无状态stateless的bean而对象使用singleton scope。
和其他scope bean不同spring容器并不管理prototype bean的完整生命周期。容器会实例化、配置、组装prototype对象并将其传递给调用方之后spring便不再记录prototype bean对象。
初始化生命周期的回调方法将会针对所有scope的bean对象调用但是对于prototype bean销毁生命周期的回调接口并不会被调用。用户在获取prototype bean之后必须对自己对prototype bean对象的内容进行清除并且释放bean对象中持有的资源。
### singleton bean中的prototype bean依赖
如果一个singleton bean中含有prototype bean依赖singleton bean中的依赖是在实例化时解析的。实例化时创建的prototype bean实例是singleton bean所应用的prototype bean的唯一实例。**代表singleton bean引用的prototype bean有且仅有一个实例**)。
如果想要在singleton bean运行时不断的获取新的prototype bean实例不能简单将prototype bean作为依赖注入到singleton bean中因为依赖注入只能在singleton bean初始化时获取prototype bean一次。可以在运行时通过getBean方法不断获取prototype bean实例每次获取的实例都是一个新的实例。
### request, session, application, websocket scopes
`request``session``application``websocket` scope都只在web环境下可用需要使用web-aware的ApplicationContext实现例如XmlWebApplicationContext。如果在常规spring ioc容器中使用上述scope会抛出IllegalStateException 异常。
### request scope
对于request scope针对每个http请求都会创建一个新的bean实例。request scope bean的作用域范围在http request级别可以在请求处理的过程中任意修改bean对象的状态因为在其他请求中也有该request scope bean一个请求对bean对象的修改对其他请求不可见。
当http请求完成后该请求关联的request scope bean将会被丢弃。
注解`@RequestScope`可以在bean定义上进行标注代表该bean对象为request scope
### Session Scope
对于一个http sessionspring容器会针对session scope bean创建一个bean实例该实例在session范围内有效。session范围内可以任意修改bean实例的状态一个session内对bean的修改对其他session是不可见的。
当session会话结束时与该http session关联的bean对象也会被丢弃。
注解`@SessionScope`可以将bean对象定义为session scope。
### application scope
针对一个web applicationspring容器会创建一个bean对象实例。在这种情况下application scope bean将会范围将会被限定为ServletContext级别并且bean实例会作为`ServletContext`的属性被存储。
注解`@ApplicationScope`可以将bean对象的范围限定为`serveltContext`级别。