【问题标题】:Creating a Spring bean holds ServletRequest properties创建一个 Spring bean 包含 ServletRequest 属性
【发布时间】:2010-08-18 17:34:30
【问题描述】:

我需要创建一个 Spring bean,以便它存储 HttpServletRequest 对象的 serverNameserverPortcontextPath 属性,以便我可以根据需要将此 bean 注入其他 bean。

在我看来,这些属性不会随任何 URI 改变,因此最好将其初始化一次(无论如何,多次传递 request 实例并没有那么昂贵)。

问题是,如何将HttpServletRequest 实例注入我的配置bean?我更喜欢基于 xml 的注入。很可能我们需要将它作为<property> 注入,但我不知道这个ServletRequest 对象的nameref 是什么。

目的是将这些变量保存在 bean 中,以便可以从任何 bean 访问它们,并且当我需要获取 serverName 等时,我不需要将 request 对象作为参数传递给许多方法。

任何想法如何创建这样的 bean 及其配置?

【问题讨论】:

  • 我认为这是个坏主意。为什么 Web 层之外的层需要知道这些事情?感觉就像您让网络信息泄漏到您的应用程序的其余部分。

标签: java spring servlets


【解决方案1】:

您可以使用request-scoped bean 执行此操作,并将当前请求自动装配到您的 bean 中:

public class RequestHolder {
   private @Autowired HttpServletRequest request;

   public String getServerName() {
      return request.getServerName();
   }
}

然后在 XML 中:

<bean id="requestHolder" class="com.x.RequestHolder" scope="request">
  <aop:scoped-proxy/>
</bean>

然后,您可以将 requestHolder bean 连接到您选择的任何业务逻辑 bean。

注意&lt;aop:scoped-proxy/&gt; - 这是将请求范围的 bean 注入单例的最简单方法 - 请参阅 Spring docs 了解其工作原理以及如何配置 aop 命名空间。

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多