目录
- 1.知识点回顾
- 2.线程安全
- 3.总结
1.知识点回顾
在 Spring 中我们可以通过 @Scope
注解来指定 Bean 的创建方式。
@Servcie
@Scope("singleton")
public class UserServiceImpl implements UserService {
}
@Scope
注解的值有两种:
singleton
:Bean 在每个 Spring IOC 容器中只有一个实例,即:单例模式。prototype
:一个 Bean 的定义可以有多个实例,即:原型模式。
当没有手动指定 Bean 的创建方式时,Spring 框架默认是使用单例模式来创建 Bean 的。
2.线程安全
我们知道 Spring 容器中的 Bean 都是单例的了,那么它是线程安全的吗?
其实 Spring 容器中的单例 Bean 并不是线程安全的,下面我们来举个例子:
上面这段代码就是一段简单的根据 ID 查询用户信息的接口,首先这里有三个需要注意的点:
UserController
本身就是一个注入到 Spring 容器中的 Bean;count
是 UserController 的一个成员变量,是线程不安全的 ;userService
也是 UserController 的一个成员变量,由于 userService 是单例的,其本身是无状态的对象,假如其内部不存在可修改的成员变量,则是线程安全的。
3.总结
-
Spring 框架中的单例 Bean 不是线程安全的。
-
Spring 框架中有一个
@Scope
注解,默认的值是singleton
,表示以单例模式创建 Bean。 -
因为一般在 Spring 的 Bean 中都是注入
无状态的对象
,没有线程安全问题,如果在 Bean 中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例
或者加锁
来解决。
整理完毕,完结撒花~ 🌻