Bean 的六种作用域

这篇具有很好参考价值的文章主要介绍了Bean 的六种作用域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Bean 的六种作用域,spring,java,spring 

目录

一、作用域是什么?

1、singleton(单例作用域)

2、prototype(原型作用域)

3、request(请求作用域)

4、session(回话作用域)

5、application(全局作用域)

6、websocket( HTTP WebSocket 作用域)

二、单例作⽤域VS 全局作⽤域

三、设置作用域

一、作用域是什么?

Bean的作用域是指Bean实例的生命周期及可见性范围,Spring框架定义了以下6种作用域:

  1.  singleton:单例作用域,所有对该Bean的请求都返回同一个Bean实例。
  2. prototype:原型作用域,每次请求时都创建一个新的Bean实例。
  3. request:请求作用域,每个HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前请求内有效。
  4.  session:会话作用域,每个HTTP会话都会创建一个新的Bean实例,该Bean实例仅在当前会话内有效。
  5. application:全局作用域,一个bean 定义对应于单个ServletContext 的生命周期。
  6. websocket: HTTP WebSocket 作用域,一个bean 定义对应于单个websocket 的生命周期。

选择适当的作用域可以提高应用程序的性能和可维护性。

 下面用一个例子来解释Bean的作用域:你和别人一起协同开发的代码中有个Bean不想别人改动,那就可以通过调整Bean的作用域来解决.

下面有两个用户张三和李四,张三呢 调用了公共对象,但是张三特意使用了 user2来接收,

此时李四也想使用这个对象;然后他们一起调用了,但是发现李四调用的时候这个Name也被修改成小猫了.这是为什么呢 张三明显创建了一个新对象

其实真实的情况是Spring的IoC容器有两种作用域模式,一种是IoC默认的singleton(单例作用域),一种是可手动修改的prototype(原型作用域 / 多例作用域),在默认情况下,IoC容器采用singleton,也就是所有人获取到的都是同一个Bean对象,这样效率会高很多.

所以当我们使用原型模式时这个问题就解决了

//张三
@Controller
public class UserController2 {

    @Autowired
    private User user;

    public void doMethod() {
        User user2 = user;
        System.out.println("UserController2 修改之前:User -> " + user);
        user2.setName("小猫");
        System.out.println("UserController2 修改之后:User -> " + user);
    }


}
//李四
@Controller
public class UserController3 {

    @Autowired
    private User user;

    public void doMethod() {
        System.out.println("UserController3:user -> " + user);
    }

}

1、singleton(单例作用域)

  • 官⽅说明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
  • 描述:该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对象。
  • 场景:通常⽆状态的Bean使⽤该作⽤域。⽆状态表示Bean对象的属性状态不需要更新
  •  备注:Spring默认选择该作⽤域

2、prototype(原型作用域)

  • 官⽅说明:Scopes a single bean definition to any number of object instances.
  • 描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。
  • 场景:通常有状态的Bean使⽤该作⽤域

Bean 的六种作用域,spring,java,spring

上图中,每个引用对应一个新的bean实例。

请注意,上图中的例子不适用于生产环境。因为DAO通常来说是无状态的bean,应该指定它的作用域为singleton比较合适

3、request(请求作用域)

  • 官⽅说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:每次http请求会创建新的Bean实例,类似于prototype
  • 场景:⼀次http的请求和响应的共享Bean
  • 备注:限定SpringMVC中使⽤

4、session(回话作用域)

  • 官⽅说明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在⼀个http session中,定义⼀个Bean实例
  • 场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
  • 备注:限定SpringMVC中使⽤

5、application(全局作用域)

  • 官⽅说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在⼀个http servlet Context中,定义⼀个Bean实例
  • 场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
  • 备注:限定SpringMVC中使⽤

6、websocket( HTTP WebSocket 作用域)

  • 官⽅说明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
  • 场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean。
  • 备注:限定Spring WebSocket中使⽤

二、单例作⽤域VS 全局作⽤域

  • singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域;
  • singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。

三、设置作用域

singleton作用域是Spring中默认的作用域,

使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,⽐如设置 Bean 的作⽤域,如下代码所示:
@Component
public class Users {
    @Scope(prototype)
    @Bean(name = "u")
    public User user() {
        User user = new User();
        user.setId(1);
        user.setName("Hi user"); 
        return user;
    }
}
@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式:
1. 直接设置值:@Scope("prototype")
2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

 Bean 的六种作用域,spring,java,spring文章来源地址https://www.toymoban.com/news/detail-694643.html

到了这里,关于Bean 的六种作用域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中的六种基本数据类型

    Python中分为六种基本数据类型 不可变类型(又叫静态数据类型,没有增删改操作):数字(number)、字符串(string)、元组(tuple) 可变类型(又叫动态数据类型,支持增删改操作):列表(list)、字典(dictionary)、集合(set) 1. 数字类型(numbers): 数字类型下还可分为整数(int)、浮点数(f

    2024年02月04日
    浏览(40)
  • 【SpringMVC]获取参数的六种方式

    目录 1.通过ServletAPI获取 2.通过控制器方法的形参获取 3.@RequestParam:将请求参数和控制器方法的形参绑定 4.@RequestHeader:将请求头信息与控制器方法的形参的值进行绑定 5. CookieValue:将cookie数据和控制器方法的形参绑定 Cookie: ​编辑 6.通过控制器方法的实体类类型的形参获取

    2024年02月09日
    浏览(53)
  • SpringBoot 实现跨域的六种方式

    目录 1.通过SpringSecurity方式配置 2.使用Spring提供的CorsFilter注入Bean(推荐) 3.使用注解@CrossOrigin注解(繁琐) 4.通过ResponseBodyAdvice 实现跨域 5.通过HttpServletResponse设置跨域 6.通过WebMvcConfigurer 实现跨域 与第5类似

    2024年02月14日
    浏览(48)
  • 斐波那契数列的六种解法

    做这个问题之前,我们需要了解到斐波那契数列是什么东西?是干什么的? 斐波那契数列是什么? 一、斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、…… 这个数列从第三项开始,每一项都等于前两项之和。 二、应用:通常在个别股票中不是太准确,通常在指数上

    2024年02月08日
    浏览(54)
  • uniapp路由跳转的六种方式

    uniapp官方文档详解: 一、uni.navigateTo保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 注意: 页面跳转路径有层级限制,不能无限制跳转新页面 跳转到 tabBar 页面只能使用 switchTab 跳转 二、uni.redirectTo关闭当前页面,跳转到应用内的某个页面。

    2024年02月11日
    浏览(45)
  • Spring bean定义&Spring Bean 的作用域

    目录 Spring bean定义   Spring配置元数据 Spring Bean 的作用域   singleton作用域:   原型作用域: 示例:   形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean。bean被实例化,组装,并通过Spring IoC容器所管理的对象。这些bean由容器提供,例如,在XML的bean/定义,已经看到了

    2024年02月08日
    浏览(43)
  • 最常见的六种跨域解决方案

    前言:什么是跨域? JSONP CORS 搭建Node代理服务器 Nginx反向代理 postMessage Websocket 总结 跨域就是当在页面上发送ajax请求时, 由于浏览器同源策略的限制,要求当前页面和服务端必须同源,也就是协议、域名和端口号必须一致 。 如果协议、域名和端口号中有其中一个不一致,

    2024年01月25日
    浏览(50)
  • vue组件间传值的六种方法

    父组件代码: 子组件代码: 页面显示: 子组件代码: 父组件代码: 页面显示: 父子组件传值原理:父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息,如下图所示: ref:如果在普通的 DOM 元素

    2024年02月15日
    浏览(50)
  • bitmap的六种压缩方式,Android图片压缩

    Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式: 其中,A代表透明度;R代表红色;G代表绿色;B代表蓝色。 ALPHA_8 表示

    2024年02月09日
    浏览(51)
  • C语言实现排序算法的六种方式

    1、冒泡法 2、交换法 每次用当前的元素一一的同其后的元素 3、选择法 从数据中选择最小的同第一个值交换,在从剩下的部分中选择最小的与第二个交换,这样往复下去 4、插入法 在前面的数中寻找相应的位置插入, 然后继续下一张 插入排序就是每一步都将一个待排数据按

    2024年01月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包