2

刚开始一个项目,涉及在 Netbeans 平台 (NBP) 中实现的富客户端,选择 Spring 框架来实现业务逻辑和数据访问。由于我来自 Web 应用程序开发背景,因此我有一些问题,也想提出一些建议。

  1. 富客户端与 Spring 集成的选项有哪些?
  2. 关于多层 Java EE 环境中的富客户端的任何最佳实践/书籍/文档?
  3. 有什么需要特别注意的吗?
4

1 回答 1

1

我们最近在我工作的公司经历了类似的经历。可悲的是,我们找不到该过程的任何明确指南。我们在这里和那里发现的是部分指南。我不确定其他人是如何处理这个问题的,我很想看看这里是否发布了任何其他解决方案。但是,我可以告诉你我们是如何处理它的,并希望你能从我们的经验中学习。

从一开始,我们就知道我们希望能够控制我们将使用哪个版本的 Spring(在我们的例子中是 Hibernate)。自然,NetBeans IDE 中内置的版本有些过时,我们希望在开发服务器代码时能够使用最先进的版本。

我们最终做的是创建两个独立的项目:一个用于我们的服务器代码(我们的服务、DAO 和域实体),另一个用于我们的客户端应用程序。然后,我们将服务器代码打包,将 jar 及其依赖项复制到客户端项目,并将这些 jar 列为客户端代码中的依赖项。我们在我们的 NetBeans 项目中创建了一个名为 SpringHibernate 的模块,它容纳了这些 jar,并且几乎所有其他模块都依赖它。

我建议创建一个 ant 任务,在将 jar 文件添加到 NetBeans 项目之前去除它们的版本号。这使您可以无缝地更新服务器代码中的 jar,而无需客户端代码知道其中的区别。(当您开始删除和重新添加 jar 时,NetBeans 可能有点挑剔。)

然后第一个主要任务是创建一个 Util 类,它可以加载您的 applicationContext.xml 并从上下文中返回 bean。此处概述了该过程。

我们遇到的主要障碍之一是创建 Sessions(或 JPA 术语中的 EntityManagers)。NetBeans 平台是一个高度线程化的环境,而 EntityManager 被设计为仅在单个线程上工作。为了解决这个问题,我们选择了 Open Session In View 路线*。我们创建了一个类,可以将相同的 EntityManager 加载到任何请求它的线程中。然后,我们创建了服务的客户端代理,在调用实际的 Spring 托管服务之前将 EntityManager 加载到其线程中。创建客户端代理服务的额外好处是可以Lookup.getDefault().lookup(Service.class)通过@ServiceProvider注释找到它们。

然后,您应该创建一个自定义 LifeCycleManager,它可以在应用程序关闭时拆除并关闭您的 EntityManager 和 EntityManagerFactory。

我希望这有帮助!

*我知道 Open Session in View 已被标记为 AntiPattern,但只要您了解与之相关的问题,您就可以缓解这些问题(通过缓存不太可能随时间变化的对象、进行智能数据库调用等.)。另外,我记得在我们的研究过程中,我们发现了 Gavin King 的一篇论坛帖子,指出 Open Session In View 是客户端应用程序的推荐路径。当然,我现在找不到该帖子,但它在某处。

于 2012-04-06T20:55:04.780 回答