spring 中 bean 的五种作用域
当通过 spring 容器创建一个 Bean 实例时, 不仅可以完成 Bean 实例的实例化, 还可以为 Bean 指定特定的作用域. Spring 支持如下 5 种作用域:
singleton: 单例模式, 在整个 Spring IoC 容器中, 使用 singleton 定义的 Bean 将只有一个实例
prototype: 原型模式, 每次通过容器的 getBean 方法获取 prototype 定义的 Bean 时, 都将产生一个新的 Bean 实例
request: 对于每次 HTTP 请求, 使用 request 定义的 Bean 都将产生一个新实例, 即每次 HTTP 请求将会产生不同的 Bean 实例. 只有在 web 应用中使用 Spring 时, 该作用域才有效
session: 对于每次 HTTP Session, 使用 session 定义的 Bean 豆浆产生一个新实例. 同样只有在 Web 应用中使用 Spring 时, 该作用域才有效
globalsession: 每个全局的 HTTP Session, 使用 session 定义的 Bean 都将产生一个新实例. 典型情况下, 仅在使用 portlet context 的时候有效. 同样只有在 Web 应用中使用 Spring 时, 该作用域才有效
其中比较常用的是 singleton 和 prototype 两种作用域. 对于 singleton 作用域的 Bean, 每次请求该 Bean 都将获得相同的实例. 容器负责跟踪 Bean 实例的状态, 负责维护 Bean 实例的生命周期行为; 如果一个 Bean 被设置成 prototype 作用域, 程序每次请求该 id 的 Bean,Spring 都会新建一个 Bean 实例, 然后返回给程序. 在这种情况下, Spring 容器仅仅使用 new 关键字创建 Bean 实例, 一旦创建成功, 容器不在跟踪实例, 也不会维护 Bean 实例的状态.
如果不指定 Bean 的作用域, Spring 默认使用 singleton 作用域. Java 在创建 Java 实例时, 需要进行内存申请; 销毁实例时, 需要完成垃圾回收, 这些工作都会导致系统开销的增加. 因此, prototype 作用域 Bean 的创建, 销毁代价比较大. 而 singleton 作用域的 Bean 实例一旦创建成功, 可以重复使用. 因此, 除非必要, 否则尽量避免将 Bean 被设置成 prototype 作用域.
参考链接: Spring 中 Bean 的五个作用域 https://www.cnblogs.com/goody9807/p/7472127.html
Spring 中的 bean 是线程安全的吗?
spring 管理的 bean 的线程安全跟 bean 的创建作用域和 bean 所在的使用环境是否存在竞态条件有关, spring 并不能保证 bean 的线程安全.
参考链接: spring 中的 bean 是线程安全的吗?
来源: http://www.bubuko.com/infodetail-3365016.html