我对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
对象可以表示多个用户?我很困惑。
暂无答案!
目前还没有任何答案,快来回答吧!