【问题标题】:Get hold of a Listener loaded the Spring context获取加载 Spring 上下文的侦听器
【发布时间】:2010-12-17 13:16:35
【问题描述】:

我有一个以标准方式加载 Spring 上下文的 Web 应用程序:

web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:META-INF/applicationContext.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>
             org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

不幸的是,我的应用程序不是“纯”Web 应用程序,这意味着我没有真正的前端,而只有 Akka 远程参与者,它们也通过 web.xml 侦听器进行初始化。 我的 Akka 演员(标准 POJO)需要获取 Spring 上下文,所以我的问题是:我如何从没有引用 Servlet 上下文的类中获取 Spring 上下文?

基本上我不能用:

WebApplicationContextUtils.getWebApplicationContext(ctx);

...因为 Akka actor 没有对 ServletContext 的引用。

谢谢。

【问题讨论】:

  • 为什么actor需要访问spring上下文?
  • 我正在使用使用某些服务的 Typed Actor。 Actor 并不真正需要获取 Spring 上下文,他们只需要注入依赖项。我在 Sprink/Akka 集成方面玩了一些,但在最新的代码版本中遇到了一些问题,也许我应该进行更多调查。无论如何,我的 Actor 需要一些服务,所以目前 - 没有注入 - 我必须从 Actor 内部使用 context.getBean(..) 方法。不是最佳的,但我正在努力。

标签: java spring akka


【解决方案1】:

您可以创建自己的初始化程序,它将创建一个具有众所周知的 id 的 SpringContextActor 实例,然后需要对 SpringContext 执行某些操作的参与者可以查看 ActorRegistry 中的 SpringContextActor 并向其发送消息。

【讨论】:

  • 太好了,谢谢你的想法。我已经实现了一个在启动时初始化的 SpringContextActor,它像任何东西一样调度 bean!
【解决方案2】:
  • 如果这些POJO是spring bean,你可以让它们实现ApplicationContextAware

  • 您可以使用@Configurable 使任何pojo 成为spring bean

  • 如果不是spring beans,可以在启动时将ServletContext存入JNDI中,通过JNDI访问。

【讨论】:

    【解决方案3】:

    我想知道一个如此强烈地依赖于网络层的设计。

    推荐的 Spring 习惯用法是有一个从 Web 层调用的 POJO 接口服务层。这样做的好处是,即使 Web 层被完全移除,也可以使用服务层。

    如果您没有服务层,也许添加一个服务层可以让您在没有网络层或应用服务器的情况下灵活地使用它。

    【讨论】:

    • 其实比这复杂一点。我确实有一个 3 层设计,问题是最前面的层实际上是一个 Akka 演员。 Actor 调用了一个最终使用 Dao 层的业务层。很基本的设计。我总是可以从 Actor 本身初始化 spring 上下文,但我认为在 Listener 中初始化上下文更优雅,因为无论如何我的 Akka Actor 都是由特定的 Listener 初始化的。
    • 但现在它们与 Web 层耦合。这并不是说当你有一个 web 层时你不应该用 Listener 来初始化它们。您只想设计它,以便在需要时分离 Web 层(例如,用于单元测试)。如果没有 Web 层就无法进行测试,则需要弄清楚如何进行。
    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多