Spring Bean 作用域
2022-08-10 15:50:15 8 举报
AI智能生成
Spring Bean 作用域
作者其他创作
大纲/内容
Spring Bean 作用域
singleton: 一个 BeanFactory 有且仅有一个实例,但是在层次性的 BeanFactory 中可能出现多个
"singleton" Bean 作用域
单例示意图:多个 bean 有关联了 accountDao 这个 Bean,拿到的 bean 都是共享实例 accountDao
Bean 的作用域严格来说不是指的 Spring Bean,而是 BeanDefinition
注意事项
一个 BeanFactory 中 singleton bean 是唯一的,但在多个 BeanFactory 中不唯一
"prototype" Bean 作用域
原型示意图:多个 bean 有关联了 accountDao 这个 Bean,拿到的 bean 都是新建实例
结论
结论一
singleton Bean 无论依赖查找还是依赖注入,均为同一个对象
prototype Bean 无论依赖查找还是依赖注入,均为新生成对象
结论二
如果依赖注入集合类型的对象, Singleton Bean 和 prototype Bean 均会存在一个,此时的 prototype Bean 还是新生成的对象,和之前的不一致。
结论三
无论是 Singleton 还是 Prototype Bean 均会执行初始化方法回调
不过仅 Singleton Bean 会执行销毁方法回调,prototype bean 注入以后就脱离 Spring 容器的管理了,所以没有销毁的回调,只有初始化的回调
不过仅 Singleton Bean 会执行销毁方法回调,prototype bean 注入以后就脱离 Spring 容器的管理了,所以没有销毁的回调,只有初始化的回调
代码示例
"request" Bean 作用域
HTTP request表示该针对每一次HTTP请求都会产生一个新的bean,仅适用于WebApplicationContext环境。
request 作用域生成的代理对象都是同一个,但是返回前端时会生成新的 Bean
request 作用域生成的代理对象都是同一个,但是返回前端时会生成新的 Bean
配置方式
<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>
"session" Bean 作用域
HTTP session表示该针对每一次HTTP请求都会产生一个新的bean,仅适用于WebApplicationContext环境。
cookie相同的时候,返回的是同一个对象。
配置方式
<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>
Java 注解 @SessionScope 或者 @Scope(WebApplicationContext.SCOPE_SESSION)
"application" Bean 作用域
application 作用域会将值存储到 ServletContext 应用上下文中去,前端可以直接从 servletContext 中获取。
配置方式
<bean class=”...” scope = “application” />
Java 注解 - @ApplicationScope 或 @Scope(WebApplicationContext.SCOPE_APPLICATION) • 实现• API - ServletContextScope
自定义 Bean 作用域
实现步骤
继承 Scope 接口,重写里面提供的方法
将自定义作用域注册到 BeanFactory 中
使用时,在对象上面添加注解 @Scope(value = SCOPE_NAME)
示例
Scope 实现类-自定义线程作用域,该作用域的作用类似于 ThreadLocal,同一个线程获取到的对象是相同的,不同对象获取到的对象是不同的。
自定义 Scope 示例类
面试题
Spring 内建的 Bean 作用域有几种
有五种:
* singleton 作用域,每次获取都是共享对象
* prototype 作用域,每次获取都是独立对象
* request 作用域,只能在 web 程序使用,每次请求都是独立对象
* session 作用域,只能在 web 程序使用,每次请求,相同会话为共享对象,不同会话为独立对象
* application 作用域,只能在 web 程序使用,每次请求都会将 bean 存到 servletContext 中
* singleton 作用域,每次获取都是共享对象
* prototype 作用域,每次获取都是独立对象
* request 作用域,只能在 web 程序使用,每次请求都是独立对象
* session 作用域,只能在 web 程序使用,每次请求,相同会话为共享对象,不同会话为独立对象
* application 作用域,只能在 web 程序使用,每次请求都会将 bean 存到 servletContext 中
singleton Bean 是否在一个应用中是唯一的
否定的,在一个 Bean Factory 中,singleton bean 是唯一的,但在层次性的 BeanFactory 中可能出现重复的情况
一个静态字段在一个 JVM 里面是不是唯一的
否定的,一个静态字段只在一个 ClassLoader 中是唯一的,一个 JVM 包含多个ClassLoader
0 条评论
下一页