模块化的Java EE应用程序

6
我需要重构一个Java EE应用程序,因为当前的设计不太模块化,实际上是一团糟。虽然有一个业务外观,但由于该应用程序由多人开发,因此原始设计已经被忽略了多次。该应用程序目前在tomcat上运行,使用JSF,但很快将移植到websphere上。我已经对不同的设计模式进行了一些研究,以封装业务逻辑并使应用程序模块化,以便将来容易添加更多功能,因为该应用程序将在未来得到增强。我已经阅读了关于OSGI的信息,但我认为那会过度了。
该应用程序已经分成了各个层。但我还没有定义API。我已经稍微整理了一下应用程序。现在所有bean都通过业务外观方法访问业务逻辑。但是,业务外观包含大约40个方法,我认为这不太好。
例如,我有这些模型类:
ManageLdap,其中包括createAccount和deleteAccount等方法 GroupManager,管理ldap组
在业务外观中,我有一个createAccount方法:
调用ManagerLdap类来创建ldap帐户 做一些日志记录 调用GroupManager
package Model.ManageLdap

public class ManageLdap 
{
  public ldapAccount createAccount() {  }

  public ldapAccount deleteAccount() {  }
}

public class GroupManager
{
  public bool addAccountToGroup(var account) {  }
}

在业务门面中

package BusinessFacade.Foo

public class SomeFoo
{
  public ldapAccount createAccount() 
  { 
    var ldapAccount = new ManageLdap.createAccount();
    Logger.log("Account created");
    var accountWasAdded = GroupManager.addAccountToGroup(ldapAccount);
  }     
}

现在,如果我想为应用程序添加额外的功能,比如为用户创建一个子版本库的选项:
  • 我必须实现一个模型类来创建仓库,
  • 在业务门面中放置一些方法,以及
  • 创建一个额外的bean供视图访问。
这使得门面变得更加庞大和混乱,但除此之外,这不是我所谓的模块化设计。
那么,如何将业务逻辑与视图分离,而不需要一个庞大的业务门面呢?

这个问题在 Stack Overflow 上已经讨论了很多次。看看这个和这个还有很多其他帖子。 - techuser soma
这可能是一个适合企业架构师架构入门的好话题。 - surfmuggle
@techuser Java 应用程序架构指南描述Java Web应用程序的架构似乎太广泛,无法回答ops的问题。阅读最佳企业购物车后,我认为查看开源代码,如BroadleafCommerce ,可能是一个很好的开始,以获取如何组织代码的想法。 - surfmuggle
我的伪代码是否与您描述的相符?这对我来说似乎不错。您是如何解决重构的问题的? - surfmuggle
1个回答

4

首先,尝试将应用程序拆分为几个层次,例如:

  • DAO
  • 服务
  • 安全性
  • 视图
  • 等等。

然后从每个层次中提取一些API(如dao-api、service-api等)。每个API模块都应该有一组接口。

然后创建一组模块(如service-apiservice-impldao-apidao-impl),并涉及一些构建工具(如gradlemaven)来管理它们。

不要允许一个实现模块依赖于另一个实现模块(只能是impl -> api或api -> api)。

每个模块都是一个独立的jar文件。

通过这样的重构,未来会更难破坏应用程序的设计。


谢谢您的回答,我已经编辑了我的原始问题,希望您能给我一些建议。 - secador de pelo
如果每个模块将被分开放置在jar文件中,那部署怎么办? - kapil das
你能详细说明一下你所说的“仅实现->API或API->API”是什么意思吗?这是否意味着一个实现可以基于几个基于另一个API的API(API或API)? - surfmuggle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接