面试题答案
一键面试1. 单例(Singleton)
- 定义:在整个Spring容器中,只存在一个Bean实例。当多次请求获取该Bean时,返回的都是同一个实例。
- 配置方式:默认就是单例作用域,一般无需额外配置。在XML配置中可显式指定
<bean id="exampleBean" class="com.example.ExampleBean" scope="singleton"/>
;在Java配置中,@Bean
注解默认也是单例。 - 应用场景:适用于无状态的Bean,如工具类、服务层组件等。例如,一个负责日志记录的Bean,它不需要维护自身状态,多个地方使用同一个实例既节省资源又能保证日志记录的一致性。
2. 原型(Prototype)
- 定义:每次请求获取Bean时,都会创建一个新的实例。
- 配置方式:XML配置
<bean id="exampleBean" class="com.example.ExampleBean" scope="prototype"/>
;Java配置可通过@Scope("prototype")
注解,如@Bean @Scope("prototype") public ExampleBean exampleBean() { return new ExampleBean(); }
。 - 应用场景:适用于有状态且不同实例间状态相互独立的Bean。比如一个处理用户会话的Bean,每个用户的会话状态是不同的,需要为每个请求创建新的实例。
3. 请求(Request)
- 定义:在一次HTTP请求中,只存在一个Bean实例,不同请求会创建不同的实例。仅适用于Web应用。
- 配置方式:XML配置
<bean id="exampleBean" class="com.example.ExampleBean" scope="request"/>
;Java配置@Bean @Scope("request") public ExampleBean exampleBean() { return new ExampleBean(); }
。 - 应用场景:当需要在一次请求范围内共享数据时使用。例如,在处理一个HTTP请求时,可能需要在多个组件间共享一些请求特定的数据,如用户登录信息等。
4. 会话(Session)
- 定义:在一个HTTP会话中,只存在一个Bean实例,不同会话会创建不同的实例。仅适用于Web应用。
- 配置方式:XML配置
<bean id="exampleBean" class="com.example.ExampleBean" scope="session"/>
;Java配置@Bean @Scope("session") public ExampleBean exampleBean() { return new ExampleBean(); }
。 - 应用场景:用于在用户会话期间保持状态的Bean。比如用户购物车功能,在整个用户会话过程中,购物车这个Bean实例应该是唯一的,不同用户的会话对应不同的购物车实例。
5. 全局会话(GlobalSession)
- 定义:仅在Portlet应用中有意义,在一个全局会话中,只存在一个Bean实例。对于非Portlet的Web应用,等同于
session
作用域。 - 配置方式:XML配置
<bean id="exampleBean" class="com.example.ExampleBean" scope="globalSession"/>
;Java配置@Bean @Scope("globalSession") public ExampleBean exampleBean() { return new ExampleBean(); }
。 - 应用场景:Portlet应用中,在全局会话范围内共享数据。
默认作用域及其应用场景
- 默认作用域:单例(Singleton)。
- 应用场景:由于大多数情况下,组件不需要维护自身状态,如业务逻辑处理的服务类、数据访问层的DAO类等,使用单例作用域可以提高系统性能,减少资源开销,因为只创建一个实例供整个应用使用。