Spring 如何启动这个应用程序?

How does Spring start this app?

我正在解析 Java 应用程序的一些继承代码,该应用程序在 JBOSS 中部署为 WAR 文件,并使用 Spring、JMS 和大黄蜂Q。由于找不到更好的词组,我正试图弄清楚是什么造就了这款应用 "go"。我见过的大多数 Spring 示例都包含一个带有 main() 方法的应用程序,该方法以某种方式强制作用于 Spring 上下文提供的 bean。此应用程序没有 main()。据我所知,这就是正在发生的事情:

当应用程序在 JBOSS 中启动时,WAR 文件的 web.xml 使用侦听器启动 Spring,并向其传递一个配置文件

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:application-context.xml</param-value>
</context-param>

Spring 然后处理 application-context.xml 文件,其中包括以下片段:

<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destination" ref="destination" />
    <property name="messageListener" ref="appListenerProxy" />

通过应用程序中的更多引用-context.xml,"appListenerProxy" 最终引用了实现 SessionAwareMessageListener 的应用程序中的 class,它响应队列中的消息。

让我感到困惑的是,我没有看到任何类型的代码来获取 jmsContainer bean 并对其进行处理。这是一个明确定义的 ID,以至于 Spring 框架正在寻找它吗?如果是这样,是否记录在某处(以及框架可能正在寻找的其他 ID)? http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html 似乎是我找到的最接近的,但它并没有真正说明该 ID 是否只是按照惯例出现在示例中,或者它是否是一个有意义的字符串。

谢谢

您实际上不需要对 DefaultMessageListenerContainer bean 及其框架部分做任何事情。

DefaultMessageListenerContainer bean 在应用程序启动时与您的 JMS 目标建立 JMS 会话。当您的目的地收到消息时,它会调用 messageListener onMessage 方法 - 在您的例子中是 appListenerProxy bean。

阅读here

spring 中的容器是框架核心的一部分。 Framework会扫描所有实现了某个容器接口的容器,并对其进行初始化。

这也依赖于控制反转 (IoC) 原则。

有关 IoC 容器的更多信息,请查看此页面: IoC Container