单例Bean 和 原型 Bean
时间: 2024-03-15 13:39:19 浏览: 147
单例 Bean 和原型 Bean 是 Spring 框架中的两种常见的 Bean 作用域。
1. 单例 Bean:
单例 Bean 是指在整个应用程序中只存在一个实例的 Bean。当我们在 Spring 容器中定义一个 Bean,并且将其作用域设置为单例时,Spring 容器会在第一次请求该 Bean 时创建一个实例,并在后续的请求中返回同一个实例。这意味着无论多少次请求,都会得到同一个对象。
2. 原型 Bean:
原型 Bean 是指每次请求都会创建一个新的实例的 Bean。当我们在 Spring 容器中定义一个 Bean,并将其作用域设置为原型时,Spring 容器会在每次请求该 Bean 时都创建一个新的实例,并返回给请求方。这意味着每次请求都会得到一个新的对象。
相关问题
单例bean面试题
单例 Bean 是 Spring 框架中非常重要的一部分,通常也是面试中的高频考点。以下是关于单例 Bean 面试题的一个简要介绍及解答思路:
### 什么是单例 Bean?
在 Spring 容器中,默认情况下所有的 Bean 都是以 **单例模式 (Singleton Pattern)** 创建的。这意味着在整个应用上下文中,对于某个 Bean 只会存在唯一的一个实例。无论我们通过 `@Autowired` 注入多少次这个 Bean,实际上获得的都是同一个对象引用。
#### 示例代码:
```java
@Component
public class SingletonBean {
public String getName() {
return "我是单例 Bean";
}
}
```
---
### 常见单例 Bean 面试问题
1. **Spring 中有多少种作用域(Scope),默认的作用域是什么?**
- 答案:Spring 提供了多种 Scope,包括但不限于 `singleton`, `prototype`, `request`, `session` 和 `application`。
默认的作用域是 `singleton`,表示容器内只有一个实例被创建并共享给所有使用者。
2. **如何验证一个 Bean 是否为单例?**
- 我们可以通过多次注入该 Bean 并比较其哈希值 (`hashCode`) 来判断是否每次得到的都是相同的实例。
```java
@Autowired
private SingletonBean bean1;
@Autowired
private SingletonBean bean2;
// 测试两个 bean 实际上是不是同一对象
System.out.println(bean1 == bean2); // 输出 true 表明它们确实相等
```
3. **如果单例 Bean 内部维护了一个可变的状态会发生什么情况?**
- 这是一个潜在的问题点!由于多个线程可能会同时访问同一个单例 Bean 的内部成员变量,如果没有妥善处理并发控制(例如加锁或使用线程安全的数据结构),那么就会导致数据竞争条件下的错误结果或者是不确定的行为发生。
4. **能否将 prototype 类型的依赖注入到 singleton Bean 中去呢? 如果可以的话需要注意些什么吗?**
- 当然能这么做! 不过需要注意的是,Spring只会在初始化阶段装配一次原型类型的组件进到那个单一实例里头; 后续即便原形bean已被销毁也不会再动态刷新替换进去新的版本.
---
###
Spring中什么是单例模式和原型模式?默认是什么模式?
在Spring中,单例模式是指在整个应用程序中只创建一个对象实例,而原型模式是指每次请求时都会创建一个新的对象实例。默认情况下,Spring使用单例模式来管理Bean。这意味着,如果您没有显式地指定Bean的作用域,Spring将使用单例模式创建Bean并返回同一个实例。如果您需要每次请求时都创建一个新的Bean实例,您可以将Bean的作用域设置为原型模式。
阅读全文
相关推荐














