interview
spring
SpringBean一共有几种作用域?

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 实例。

用途

面试这个内容主要是为了考察候选人对 Spring 框架的理解和掌握程度,尤其是对 Bean 作用域的理解。在实际生产环境中,正确地使用 Bean 作用域可以有效地管理 Bean 的生命周期和作用范围,提升应用程序的性能和可维护性。例如,在 Web 应用中,不同的请求可能需要独立的 Bean 实例(prototype 作用域),而共享的配置类可以使用 singleton 作用域以节省资源。\n

相关问题

🦆
Spring Bean 的生命周期包括哪些步骤?

Spring Bean 的生命周期主要包括以下步骤:实例化、属性赋值、初始化、销毁。在这些步骤中可以通过实现 InitializingBean 接口、使用 @PostConstruct 注解来定义初始化方法,使用 DisposableBean 接口、@PreDestroy 注解来定义销毁方法。

🦆
如何在 Spring 中使用自定义的初始化和销毁方法?

可以通过 @Bean 注解的 initMethod 和 destroyMethod 属性来指定自定义的初始化和销毁方法。例如:

 
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {
    return new MyBean();
}
 

也可以通过实现 InitializingBean 和 DisposableBean 接口来定义这些方法。

🦆
什么是 Spring 中的依赖注入,主要有哪些方式?

依赖注入是 Spring 的核心特性之一,通过注入依赖对象而不是在代码中直接创建它们来实现松耦合。主要有三种方式:构造器注入、setter 方法注入和字段注入。构造器注入在创建对象时就注入依赖,setter 方法注入在对象创建后注入依赖,字段注入通过 @Autowired 注解直接在字段上注入。

🦆
Spring 中的 @Component,@Service,@Repository 和 @Controller 有什么区别?

@Component 是一个泛化的注解,用于标识 Spring 管理的 Bean。@Service 标识服务层组件,通常用于业务逻辑层。@Repository 标识数据访问层组件,带有持久化异常转换功能。@Controller 标识控制层组件,用于处理 HTTP 请求。它们都是 @Component 的特化形式,功能上没有本质区别,只是用于语义上的区分和组织代码。