Files
rikako-note/spring/Spring core/SpringIOC.md
2023-10-24 14:34:52 +08:00

54 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spring IOC
## Bean Scope
### 简介
当创建一个bean定义时实际上根据bean定义创建了一个配方该配方用于创建类型的实际实例。可以基于一个配方创建多个对象实例。
### singleton
对于一个被容器管理的singleton bean来说只在容器中存在一个共享的实例。所有针对该bean的请求spring容器都会返回同一个实例。
当创建一个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
> #### request scope
> spring mvc中请求和线程相绑定如果在接收到一个请求后在新的线程中对请求进行处理那么新的线程将不会绑定旧的http请求。
>
> 对于request scope只有在接收请求的线程内调用getBean方法才能获取到bean实例若新开一个线程处理请求那么在新线程内调用getBean方法将会抛出异常
### 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`级别。