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