Bean 的作⽤域

本文介绍了Spring框架中Bean的六种作用域,包括singleton(单例,默认)、prototype(原型/多例)、request(请求)、session(会话)、application(全局)以及websocket(WebSocket)。每个作用域都有其特定的使用场景,例如单例适用于无状态的Bean,而原型则用于有状态的Bean。通过@Scope注解可以设置Bean的作用域。
摘要由CSDN通过智能技术生成

❣️关注专栏:JavaEE

之前我们在 Java 中说的作用域是限定程序中变量的可⽤范围,或者说在源代码中定义变量的某个区域就叫做作⽤域。

那么  Bean 的作⽤域是什么呢?接下来看看:
Bean 的作⽤域(默认是单例模式)是指 Bean 在 Spring 整个框架中的某种⾏为模式。该如何理解这个行为模式呢?用singleton 单例作⽤域举个例子:singleton 表示该作⽤域下的 Bean 在 Spring 容器中只存在⼀个实例,并且是全局共享的,也就是说当其他⼈修改了某个值之后,那么另⼀个⼈读取到的就是这个被修改的值。

🍓 1 Bean 的 6 种作⽤域

🍓 1.1 singleton:单例作⽤域(Spring 的默认作用域)

🖖描述:该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对象。

🖖单例模式是处于对 Spring 框架的性能考虑,当只有是单例模式的时候,就是初始化一次,当每次使用的时候就直接使用已经初始化好的,不用再去初始化了。

🖖适用场景:通常⽆状态的 Bean 使⽤该作⽤域。⽆状态表示 Bean 对象的属性状态不需要更新。如果属性需要更新,那就不能再使用单例模式了。

🍓 1.2 prototype:原型作⽤域(多例作⽤域)

🖖描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过
applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象
实例。

🖖多例模式就意味着,每次处理一个请求都会生成一个 Bean 对象,而新生成一个对象,就要开辟空间,就要初始化,进行响应类的验证......(都是需要时间去执行类加载的)

🖖适用场景:通常有状态的Bean使⽤该作⽤域

🍓 1.3 request:请求作⽤域

🖖描述:每次 http 请求会创建新的 Bean 对象,类似于 prototype
🖖适用场景:⼀次 http 的请求和响应的共享 Bean,限定于 SpringMVC/SpringWeb 中使⽤

🍓 1.4.session:会话作⽤域

🖖描述:在⼀个http session中,定义⼀个 Bean 对象。每次 session 会话共享一个 Bean。
🖖适用场景:⽤户会话的共享 Bean,⽐如:记录⼀个⽤户的登陆信息。限定 SpringMVC/SpringWeb 中使⽤

🍓 1.5.application:全局作⽤域

🖖描述:在⼀个 http servlet Context 中,定义⼀个Bean实例,在同一个 content 中使用的是同一个 bean。下次再创建一个 http servlet Context 来获取 Bean 的时候,就不会是同一个 bean 了,就会新创建一个 Bean 对象了。
🖖适用场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息。限定 SpringMVC 中使⽤

🍓 1.6 websocket:HTTP WebSocket 作⽤域

🖖描述:在⼀个 HTTP WebSocket 的⽣命周期中,定义⼀个Bean实例。
🖖适用场景:WebSocket的每次会话中,保存了⼀个 Map 结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到 WebSocket 结束都是同⼀个Bean。网络长连接,限定于Spring WebSocket中使⽤

🍓 2 设置作⽤域

🍓 2.1 直接设置值:@Scope("prototype")

在 Spring 当中默认是单例模式,如果想要设置某一作用域,就可以使用 @Scope() 来设置。

@Component
public class UserBeans {
    @Bean
    @Scope("prototype")  // 直接设置值
    public User user() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

🍓 2.2使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public class UserBeans {
    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)  // 使⽤枚举设置
    public User user() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值