Spring面试题, Spring Bean 一共有几种作用域?
Spring面试题, Spring Bean 一共有几种作用域?
QA
Step 1
Q:: Spring Bean 一共有几种作用域?
A:: Spring Bean 一共有六种作用域:
1.
singleton:整个 Spring 容器中,只有一个 Bean 实例,默认作用域。
2.
prototype:每次获取 Bean 时都会创建一个新的实例。
3.
request:每次 HTTP 请求会创建一个新的实例,适用于 Web 应用。
4.
session:在一个 HTTP Session 中,Bean 是唯一的实例,适用于 Web 应用。
5.
application:在一个 ServletContext 范围内,Bean 是唯一的实例,适用于 Web 应用。
6.
websocket:在一个 WebSocket 会话中,Bean 是唯一的实例,适用于 WebSocket 应用。
Step 2
Q:: 如何在 Spring 中定义和使用 prototype 作用域的 Bean?
A:: 可以通过 @
Scope 注解来定义 prototype 作用域的 Bean。例如:
@Component
@Scope("prototype")
public class MyPrototypeBean {
// Bean 内容
}
使用时,每次调用 ApplicationContext.getBean("myPrototypeBean")
都会返回一个新的实例。
Step 3
Q:: singleton 和 prototype 作用域在使用时有哪些区别?
A:: singleton 作用域的 Bean 在 Spring 容器启动时就创建,并且整个容器中只有一个实例。而 prototype 作用域的 Bean 是在每次请求时创建新的实例。因此,singleton Bean 是线程安全的,而 prototype Bean 不是,需要自行处理线程安全问题。
Step 4
Q:: Spring 中的 @
Autowired 注解在 prototype Bean 中使用有什么需要注意的?
A:: 在 prototype Bean 中使用 @Autowired 注解时,需要注意依赖注入的对象如果是 singleton 作用域的,会导致共享状态,因此可能需要使用 @
Lookup 方法注解来解决这种情况,确保每次注入时都获取新的 prototype Bean 实例。