关于Spring Bean作用域的不可描述的事情

本文仅作为个人的学习记录,主要借鉴资料也已标注。

参考资料:

https://blog.csdn.net/fuzhongmin05/article/details/73389779

五个作用域

类别说明优点缺点
singleton单例,即SpringIOC容器只有一个实例,spring的默认作用域占用空间小永远存活,如果有静态属性的多线程操作就会出现线程冲突的问题
prototype原型,即SpringIOC容器每次根据应用上下文每次调用时去创建一个新的实例每个Bean独立,不存在多线程的问题这种方式创建的Bean生命周期不在Spring的管理范围,内存占用较大
request请求,每次http请求的时候都会创建一个新的Bean特定情况仅在基于web的Spring ApplicationContext情形下有效
session会话,同一个http session请求的时候都会共享同一个的Bean特定情况仅在基于web的Spring ApplicationContext情形下有效
globalSession全局会话,在一个全局的HTTP Session中,一个bean定义对应一个实例特定情况仅在基于web的Spring ApplicationContext情形下有效

1.singleton 单例

Spring的默认作用域,也是最常见的作用域,一般不写@Scope注解的话,也是默认单例。使用这种模式,bean会在
每次getBean()调用的时候,返回同一个的代理对象,且bean对象的生命周期由Spring管理,且应用中值只存在一
个Bean实例。所以在存在公共状态属性时,多线程情况下会出现线程不安全的情况。

java:

@Service
@Scope("singleton")
public class Demo {
    // ...
}

xml:

<bean id="account" class="com.daer.Demo" singleton="true"/> 

2.prototype 原型模式

Spring另外一种比较常见的作用域,需要使用@Scope(“prototype ”)注释。使用这种模式,bean会在每次
getBean()调用的时候,返回一个全新的代理对象,并且Spring不管理其生命周期,

java:

@Service
@Scope("prototype")
public class Demo {
    // ...
}

xml:

<bean id="account" class="com.daer.Demo" singleton="false"/><bean id="account" class="com.daer.Demo" scope="prototype"/>

3.request 请求模式

针对Web应用的专用作用域,对应request请求,单个request请求通过getBean()获取的bean是一样的,不同的
request请求获取的bean是相互独立的,且不由Spring管理生命周期。(目前没使用过)

java:

@Service
@Scope("request")
public class Demo {
    // ...
}

xml:

<bean id="account" class="com.daer.Demo" scope="request"/>

4.session请求模式

针对Web应用的专用作用域,对应session请求,单个session请求通过getBean()获取的bean是一样的,不同的
session请求获取的bean是相互独立的,且不由Spring管理生命周期。(目前没使用过)

java:

@Service
@Scope("session")
public class Demo {
    // ...
}

xml:

<bean id="account" class="com.daer.Demo" scope="session"/>

5.golabSession请求模式

针对Web应用的专用作用域,只有 Portlet 容器才有,对应globalSession请求,表示在一个全局的http Session通过getBean()获取的bean是一样的,且不由Spring管理生命周期。()

java:

@Service
@Scope("golabSession")
public class Demo {
    // ...
}

xml:

<bean id="account" class="com.daer.Demo" scope="golabSession"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过合适的作用域和同步机制实现Spring Bean的线程安全,可以采取以下几种方法: 1. 使用Singleton作用域:将Bean声明为Singleton作用域,确保只有一个实例存在于容器Spring默认使用Singleton作用域。这样多个线程共享同一个实例,但需要注意,如果Bean使用了可变状态,需要采取同步机制来保护共享数据的一致性。 2. 使用Prototype作用域:将Bean声明为Prototype作用域,这样每次请求该Bean时都会创建一个新的实例。这种方式可以避免线程安全问题,但也可能导致资源消耗过多。 3. 使用Thread作用域Spring提供了Thread作用域,可以将Bean绑定到当前线程。这样每个线程都有自己独立的Bean实例,不存在线程安全问题。 4. 使用同步机制:如果在Singleton作用域Bean存在可变状态,并且多个线程同时修改该状态,可以使用同步机制来保证线程安全。常见的同步机制包括synchronized关键字、Lock接口等。通过在关键代码块或方法上添加同步机制,可以确保多个线程按序访问和修改共享状态。 需要注意的是,使用同步机制可能会引入性能开销和潜在的死锁问题,因此在设计线程安全的Bean时,需要权衡性能和安全性之间的平衡。 总结来说,通过合适的作用域和同步机制,可以实现Spring Bean的线程安全。选择合适的作用域和同步机制取决于具体的业务需求和线程安全的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值