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 均会执行初始化方法回调<br>不过仅 Singleton Bean 会执行销毁方法回调,prototype bean 注入以后就脱离 Spring 容器的管理了,所以没有销毁的回调,只有初始化的回调
代码示例
"request" Bean 作用域
HTTP request表示该针对每一次HTTP请求都会产生一个新的bean,仅适用于WebApplicationContext环境。<br>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 作用域有几种
有五种:<br> * singleton 作用域,每次获取都是共享对象<br> * prototype 作用域,每次获取都是独立对象<br> * request 作用域,只能在 web 程序使用,每次请求都是独立对象<br> * session 作用域,只能在 web 程序使用,每次请求,相同会话为共享对象,不同会话为独立对象<br> * application 作用域,只能在 web 程序使用,每次请求都会将 bean 存到 servletContext 中
singleton Bean 是否在一个应用中是唯一的
否定的,在一个 Bean Factory 中,singleton bean 是唯一的,但在层次性的 BeanFactory 中可能出现重复的情况<br>
一个静态字段在一个 JVM 里面是不是唯一的<br>
否定的,一个静态字段只在一个 ClassLoader 中是唯一的,一个 JVM 包含多个ClassLoader
0 条评论
下一页