在 Spring 中,Bean 的作用域(Scope)定义了 Bean 的生命周期和可见范围。Spring 提供了多种作用域,开发者可以根据需求选择合适的范围。以下是 Spring 中常见的 Bean 作用域:
1. Singleton(单例)
- 默认作用域。
- 在整个 Spring 容器中,一个 Bean 只有一个实例。
- 所有对该 Bean 的请求都会返回同一个实例。
- 适合无状态的 Bean,例如 Service、DAO 等。
示例:
@Component
@Scope("singleton") // 可省略,默认就是 singleton
public class UserService {
// ...
}
2. Prototype(原型)
- 每次请求时都会创建一个新的 Bean 实例。
- 适合有状态的 Bean,例如每次请求都需要独立实例的场景。
示例:
@Component
@Scope("prototype")
public class UserSession {
// ...
}
3. Request(请求)
- 每个 HTTP 请求都会创建一个新的 Bean 实例。
- 仅适用于 Web 应用程序。
- 适合存储与请求相关的数据,例如用户请求信息。
示例:
@Component
@Scope("request")
public class UserRequestData {
// ...
}
4. Session(会话)
- 每个 HTTP Session 都会创建一个新的 Bean 实例。
- 仅适用于 Web 应用程序。
- 适合存储与用户会话相关的数据,例如用户登录信息。
示例:
@Component
@Scope("session")
public class UserSessionData {
// ...
}
5. Application(应用)
- 每个 ServletContext 生命周期内创建一个 Bean 实例。
- 仅适用于 Web 应用程序。
- 适合存储全局共享的数据,例如应用配置。
示例:
@Component
@Scope("application")
public class AppConfig {
// ...
}
6. WebSocket(WebSocket 会话)
- 每个 WebSocket 会话生命周期内创建一个 Bean 实例。
- 仅适用于 Web 应用程序。
- 适合存储与 WebSocket 会话相关的数据。
示例:
@Component
@Scope("websocket")
public class WebSocketSessionData {
// ...
}
7. 自定义作用域
Spring 允许开发者自定义作用域,通过实现 Scope
接口并注册到 Spring 容器中。
示例:
public class CustomScope implements Scope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
// 自定义获取 Bean 的逻辑
}
@Override
public Object remove(String name) {
// 自定义移除 Bean 的逻辑
}
@Override
public void registerDestructionCallback(String name, Runnable callback) {
// 自定义销毁回调的逻辑
}
@Override
public Object resolveContextualObject(String key) {
// 自定义解析上下文对象的逻辑
}
@Override
public String getConversationId() {
// 自定义会话 ID 的逻辑
}
}
// 注册自定义作用域
@Configuration
public class AppConfig {
@Bean
public CustomScope customScope() {
return new CustomScope();
}
@Bean
public static CustomScopeConfigurer customScopeConfigurer() {
CustomScopeConfigurer configurer = new CustomScopeConfigurer();
configurer.addScope("custom", customScope());
return configurer;
}
}
总结
Spring 提供了多种 Bean 作用域,常见的有:
- Singleton:默认作用域,整个容器中只有一个实例。
- Prototype:每次请求时创建一个新实例。
- Request:每个 HTTP 请求创建一个新实例。
- Session:每个 HTTP Session 创建一个新实例。
- Application:每个 ServletContext 生命周期内创建一个实例。
- WebSocket:每个 WebSocket 会话生命周期内创建一个实例。
- 自定义作用域:通过实现
Scope
接口自定义作用域。
根据具体需求选择合适的作用域,可以更好地管理 Bean 的生命周期和可见范围。
THE END
暂无评论内容