interview
spring
Spring Bean 一共有几种作用域

Spring 面试题, Spring Bean 一共有几种作用域?

Spring 面试题, Spring Bean 一共有几种作用域?

QA

Step 1

Q:: Spring Bean 一共有几种作用域?

A:: Spring Bean 有五种常用的作用域,分别是: 1. singleton: 默认作用域,每个容器中只创建一个实例。 2. prototype: 每次请求都会创建一个新的 Bean 实例。 3. request: 在 Web 应用中,每个 HTTP 请求都会创建一个 Bean 实例。 4. session: 在 Web 应用中,每个 HTTP session 都会创建一个 Bean 实例。 5. application: 在 Web 应用中,每个 ServletContext 都会创建一个 Bean 实例。

Step 2

Q:: Spring 中如何定义 Bean 的作用域?

A:: 在 Spring 中,可以通过 @Scope 注解或在 XML 配置文件中使用 scope 属性来定义 Bean 的作用域。例如,使用 @Scope("prototype") 注解可以将某个 Bean 定义为 prototype 作用域。

Step 3

Q:: Singleton 和 Prototype 作用域有什么区别?

A:: Singleton 作用域确保容器中只有一个 Bean 实例,并且每次注入时都会返回相同的实例。Prototype 作用域则每次注入都会返回一个新的实例。Singleton 适用于无状态的 Bean,而 Prototype 则适用于需要频繁创建新实例的场景。

Step 4

Q:: 如何在 Spring 中创建自定义的 Bean 作用域?

A:: 可以通过实现 org.springframework.beans.factory.config.Scope 接口并注册到 ConfigurableBeanFactory 中来创建自定义的作用域。你需要实现 get 方法返回 Bean 实例,以及 remove 方法用于销毁 Bean 实例。

用途

了解 Spring Bean 的作用域对于开发人员理解 Spring IoC 容器的行为非常重要。不同的作用域可以帮助开发人员有效地管理 Bean 的生命周期和内存使用。在实际生产环境中,开发人员需要根据业务需求选择合适的作用域。例如,在处理无状态服务时,可以使用 singleton 作用域,而对于频繁变动的数据处理,可以使用 prototype 作用域。对于 Web 应用,需要在 request 和 session 作用域之间做出选择,以确保 Bean 实例在正确的生命周期内存在。\n

相关问题

🦆
Spring Bean 生命周期是什么?

Spring Bean 生命周期包括实例化、依赖注入、初始化、使用、销毁五个主要阶段。通过实现 InitializingBean 和 DisposableBean 接口,或者使用 @PostConstruct 和 @PreDestroy 注解,可以自定义初始化和销毁逻辑。

🦆
Spring 中如何管理 Bean 的依赖?

Spring 通过依赖注入(Dependency Injection,DI)来管理 Bean 的依赖关系。DI 有两种主要方式:构造器注入和 Setter 注入。通过使用 @Autowired 注解,可以让 Spring 自动注入 Bean 的依赖。

🦆
如何避免 Spring Bean 的循环依赖?

Spring 通过三级缓存机制避免了循环依赖问题。在实际开发中,循环依赖通常是设计不当导致的,可以通过重构代码、使用 @Lazy 注解等方式来避免循环依赖。

🦆
Spring 中如何处理线程安全问题?

Spring 提供了多种方式来处理线程安全问题。例如,可以将 Bean 设置为 prototype 作用域来避免并发问题,也可以使用 ThreadLocal 变量来确保线程安全。对于 Singleton Bean,需要确保其无状态或状态不可变。

🦆
Spring 中的事务管理是如何实现的?

Spring 提供了声明式事务管理和编程式事务管理。声明式事务管理通过 @Transactional 注解来管理事务边界,而编程式事务管理则通过 TransactionTemplate 或 PlatformTransactionManager 接口手动管理事务。