gpt4 book ai didi

java - 通过 RequestContext 与通过注入(inject)获取 Spring LocalResolver?

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:23 25 4
gpt4 key购买 nike

技术上可以获得 LocaleResolver以两种不同的方式实例化:

但是哪个是更好的方法呢?

<小时/>

背景/背景:

我已经实现了一个自定义变体区域设置更改拦截器。那是一个HandlerInterceptor其工作原理有点像正常的 LocaleChangeInterceptor ,使用注入(inject)的方式获取LocaleResolver。它起作用了。

但是今天我仔细研究了 LocaleChangeInterceptor。我注意到他们不会注入(inject) LocaleResolver 而是从请求上下文 (RequestContextUtils.getLocaleResolver(request))* 获取它们。

现在我有点担心,在通过 HandlerInterceptor 中注入(inject)获取 LocaleResolver 时,我是否忽略了陷阱或类似的东西? - 有什么想法吗?

<小时/>

*DispatcherServlet保存一个 LocaleResolver 实例(通过注入(inject)或自行创建获得)并将它们放入每个请求的每个请求上下文中。

最佳答案

我认为没有任何陷阱。

RequestContextUtils.getLocaleResolver(HttpServletRequest) 实现为

public static LocaleResolver getLocaleResolver(HttpServletRequest request) {
return (LocaleResolver) request.getAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE);
}

换句话说,它是从 HttpServletRequest 属性获取的。使用 DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE 提示我们 DispatcherServlet 可能正在设置它。它的 initLocaleResolver() 方法实现为

private void initLocaleResolver(ApplicationContext context) {
try {
this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("Using LocaleResolver [" + this.localeResolver + "]");
}
}
catch (NoSuchBeanDefinitionException ex) {
// We need to use the default.
this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate LocaleResolver with name '" + LOCALE_RESOLVER_BEAN_NAME +
"': using default [" + this.localeResolver + "]");
}
}
}

因此,它从上下文中获取它的 LocaleResolver 或从某些默认配置生成它,即。 DispatcherServlet.properties 资源。

总之,如果您声明一个 LocaleResolver bean,则使用 @Autowired 注入(inject)它并从 RequestContextUtils.getLocaleResolver(request) 获取它都将获得相同的实例。请参阅 DispatcherServlet#doService(..) 方法的

[...]
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
[...]
<小时/>

LocaleChangeInterceptor 使用static 实用程序,因为它不是 Spring 意义上的 bean。它是一个 Spring MVC 组件,不一定是 WebApplicationContext 的一部分,因此不属于其生命周期,即。它不能注入(inject)任何东西。

关于java - 通过 RequestContext 与通过注入(inject)获取 Spring LocalResolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com