刚开始涉及在Netbeans平台(NBP)中实现的富客户端的项目,选择Spring框架来实现业务逻辑和数据访问。由于我来自Web应用程序开发背景,我有一些问题,也想要一些建议。
答案 0 :(得分:1)
我们最近在我工作的公司经历过类似的经历。可悲的是,我们找不到任何形式的权威指南。我们发现的是这里和那里的部分指南。我不确定其他人是如何处理这个问题的,我很想知道是否有其他解决方案在这里发布。但是,我可以告诉你我们是如何处理它的,并希望你能从我们的经验中学习。
从一开始,我们就知道我们希望能够控制我们将使用的Spring版本(以及我们的Hibernate)。当然,NetBeans IDE中内置的版本有点过时,我们希望在开发服务器代码时能够获得最先进的版本。
我们最终做的是创建两个单独的项目:一个用于我们的服务器代码(我们的服务,DAO和域实体),另一个用于我们的客户端应用程序。然后我们查看服务器代码,将jar及其依赖项复制到客户端项目,并将这些jar作为依赖项列在客户端代码中。我们在我们的NetBeans项目中创建了一个名为SpringHibernate的模块,该模块容纳了这些jar,几乎所有其他模块都依赖于它。
我建议创建一个ant任务,在将它们添加到NetBeans项目之前删除jar的版本号。这使您可以在服务器代码中无缝更新您的jar,而客户端代码却不知道其中的区别。 (当您开始删除并重新添加jar时,NetBeans会有点挑剔。)
然后,第一个主要任务是创建一个Util类,它可以加载applicationContext.xml并从上下文返回bean。该流程概述为here。
我们遇到的一个主要障碍是Sessions(或JPA术语中的EntityManagers)的创建。 NetBeans平台是一个高度线程化的环境,EntityManagers只能在单个线程上运行。为了解决这个问题,我们选择了Open Session In View route *。我们创建了一个类,可以将相同的EntityManager加载到请求它的任何线程中。然后,我们创建了服务的客户端代理,这些代理将在调用实际的Spring管理服务之前将EntityManager加载到其线程中。创建客户端代理服务的额外好处是可以通过Lookup.getDefault().lookup(Service.class)
注释找到@ServiceProvider
。
然后你应该create a custom LifeCycleManager在应用程序关闭时可以拆除并关闭你的EntityManager和EntityManagerFactory。
我希望这有帮助!
*我知道View中的Open Session已经labeled作为AntiPattern,但只要您了解与之相关的问题,您就可以缓解这些问题(通过缓存不太可能随时间变化的对象) ,进行智能数据库调用等)。另外,我记得在我们的研究中,我们发现了一篇由Gavin King撰写的论坛帖子,指出Open Session In View是客户端应用程序的推荐路径。当然,我现在找不到这个帖子,但是它出现在某个地方。