关于单例作用域和示例变量的java问题

disho6za  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(198)

我对java编程和spring框架还比较陌生。我的理解是,带有示例变量的javabean类是有状态的,因此它们不是线程安全的,不应该是单例的。这就是为什么我使用下面的注解标记了所有具有示例变量的javabean类

Scope("prototype")

但是,我遇到了一段来自一个开源项目的代码,它看起来如下所示(有些部分是经过编辑的):

@Path("/clients")
@Component
@Scope("singleton")
public class ClientsApiResource
{
  private final PlatformSecurityContext context;

  @Autowired
  public ClientsApiResource( final PlatformSecurityContext context )
  {
    this.context = context;
  }

  private void verifyPermission() throws PermissionViolationException
  {
    AppUser user = this.context.authenticatedUser();
    if( !user.hasPermission( "VIEW_CLIENT_PROFILE" ) )
    {
      throw new PermissionViolationException( "User does not have required permission to view client profile!" );
    }
  }
}

我被这段代码弄糊涂了。 ClientsApiResource 是一个单例类,这意味着在应用程序启动时只创建了一个示例。
PlatformSecurityContext 包含用户身份验证信息的对象被注入到单例中 ClientsApiResource 对象,并作为 PlatformSecurityContext 对象在整个过程中不会更改 ClientsApiResource 对象的寿命。
单身汉 ClientsApiResource 对象服务于多个http请求。我的理解是,每个请求都由spring框架创建的不同线程提供服务,但所有这些线程共享相同的线程 ClientsApiResource 对象和相同的 PlatformSecurityContext 对象。
为什么会一样 PlatformSecurityContext 对象可以表示多个用户?我很困惑。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题