【问题标题】:How to inject spring beans from external war?如何从外部战争中注入春豆?
【发布时间】:2015-06-18 07:32:22
【问题描述】:

我想创建一个分离的前端 (vaadin) 和后端 (spring)。两者都应该在同一个tomcat 应用服务器上运行,但每个都是一个war,所以我可以重新部署前端而无需重新启动后端。

我想最小化两个应用程序之间的远程处理代码以交换数据。因此,我认为我可以将后端的服务 bean 注入前端 war。但这可能吗?如何在两个 war 文件/java 项目之间共享服务声明?

什么类型的远程处理在这里是合适的?理想情况下,我可以想象有一种机制,我可以在前端“使用”后端服务类,并将代理连接在一起。但是怎么做呢?

【问题讨论】:

  • 您正在进入 Java EE 领域。
  • 你不能 @Inject 一个类从 WAR 到另一个,因为它们占用不同的类加载器。
  • 我想得越多,听起来越愚蠢的结构。

标签: java spring jakarta-ee


【解决方案1】:

你想解耦后端和前端,很好。您想将它们放在同一个 tomcat 上的单独战争中,仍然有可能,但它有影响。

但是现在您想将 bean 从后端注入前端。如果他们处于单独的战争中,那就不可能了。即使在同一个 tomcat 上,每场战争如果完全独立于其他战争,它们应该只通过网络进行通信(通常通过 Web 服务)。

您有两个可用的解耦级别:

  • 双方都打一场。这里的前端包括视图和控制器层、服务的后端和持久层。耦合由您在控制器中注入的服务接口提供。这是一个单一的网络应用程序
  • 各自作为 2 个独立的 Web 应用程序在自己的战争中。前端将具有与前一种情况相同的视图和控制器层,以及一个将 REST 请求发送到后端的瘦服务层。并且后端将具有与前一种情况相同的服务和持久层,没有视图层和 REST 控制器来处理来自前端的请求。

对于中低负载,第一个解决方案将使用更少的资源,但在真正巨大的负载下,第二个解决方案将具有更大的可扩展性,前端和后端的服务器场(不说前端和数据库服务器之前的反向代理)后台)

【讨论】:

    【解决方案2】:

    如果我对您的问题的理解正确,您希望将前端代码与后端分开。

    您可以做的是创建后端实现的.jar 文件,并在前端从 XML 或 Java 应用程序上下文中实例化 bean。

    如果您不想为每次配置更改重新部署应用程序,我更愿意使用 XML 配置。

    在您的前端代码中,您必须包含您的后端 jar,并且您可以以常规 Spring 方式调用这些服务。

    【讨论】:

      【解决方案3】:

      是的,您可以从 jar / war 加载外部 spring-context.xml 以获取 bean,请查看此答案 here

      【讨论】:

        【解决方案4】:

        您可以将 Spring bean 绑定到 JNDI 并在前端接收此对象。
        http://docs.spring.io/autorepo/docs/spring/3.2.3.RELEASE/javadoc-api/org/springframework/jndi/JndiTemplate.html#bind%28java.lang.String,%20java.lang.Object%29

        但在这个解决方案中,两场战争的脱钩并没有真正成功。当必须将其部署在同一个容器中时,我没有看到在两个 war 文件中分离前端和后端有任何好处。

        我更愿意部署一个 war 文件或在前端和后端之间使用 REST 进行通信。

        【讨论】:

          猜你喜欢
          • 2016-04-25
          • 1970-01-01
          • 2013-07-11
          • 1970-01-01
          • 2022-11-10
          • 2016-10-27
          • 2014-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多