Spring 定义一个可以访问请求的请求范围的 bean object

Spring define a request scoped bean that has access to the request object

我正在将使用 guice 和 guice-servlet DI 库的 Java 应用程序迁移到 Spring(既作为 Web 框架又作为 DI)。

我需要迁移以下带有 GUICE 的代码:

import com.google.inject.servlet.RequestScoped;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.servlet.http.HttpServletRequest;

@RequestScoped
public class CurrentUserProvider implements Provider<User> {

  private static final String CURRENT_USER_HEADER = "x-current-user";

  @Inject
  private Provider<HttpServletRequest> requestProvider;

  @Override
  public User get() {
    return new User(requestProvider.get().getHeader(CURRENT_USER_HEADER));
  }
}

在我的 Guice 模块中,我有类似的东西: bind(User.class).toProvider(CurrentUserProvider.class); 这基本上使我能够在我的应用程序的任何位置向当前用户注入 User object。

基本上这个想法是有一个请求范围的 bean,它从请求的 header 中获取信息。我看到在 Spring 中有一个与 Guice 中类似的用于请求范围的注释。

我不明白的是: 如何创建一个可以访问当前请求的 header 的 bean(即使它是 Spring object)? 限制:我希望能够使用 Java 注释(而不是 XML) 奖励:如果它能以某种方式与现有提供商合作,那就太好了。

您忘记了@Component让Spring认为class是一颗豆子。那么你需要 @Autowired 而不是 @Inject 来请求 HttpServletRequest 被注入。根据文档,请求范围的所有 spring 个 bean 都可以要求注入 HttpServletRequest

至于提供商,您甚至不需要它来阅读该请求。可以直接从HttpServletRequest

读取
@Component
@RequestScoped
public class CurrentUserProvider implements Provider<User> {

  private static final String CURRENT_USER_HEADER = "x-current-user";

  @Autowired
  private HttpServletRequest httpServletRequest;

  @Override
  public User get() {
  return new User(httpServletRequest.getHeader(CURRENT_USER_HEADER));
   }

}