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

在 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 作用域,常见的有:

  1. Singleton:默认作用域,整个容器中只有一个实例。
  2. Prototype:每次请求时创建一个新实例。
  3. Request:每个 HTTP 请求创建一个新实例。
  4. Session:每个 HTTP Session 创建一个新实例。
  5. Application:每个 ServletContext 生命周期内创建一个实例。
  6. WebSocket:每个 WebSocket 会话生命周期内创建一个实例。
  7. 自定义作用域:通过实现 Scope 接口自定义作用域。

根据具体需求选择合适的作用域,可以更好地管理 Bean 的生命周期和可见范围。

THE END
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容