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));
}
}
我正在将使用 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));
}
}