Design patterns J2EE设计模式-如何使应用程序独立于后端服务

Design patterns J2EE设计模式-如何使应用程序独立于后端服务,design-patterns,rest,jakarta-ee,Design Patterns,Rest,Jakarta Ee,我正在尝试开发一些RESTfulWeb服务,这些服务必须访问一些后端系统以获取数据。这些后端源可以是以下任意一种: 通过JDBC访问数据库 ERP,通过SOAP进行通信 另一个J2EE应用程序,通过SOAP或REST进行通信 在我的级别上,我能做什么才能在我的业务层和DAO之间实现松散耦合?有什么设计模式可以帮助我吗 非常感谢你的帮助 我希望我正确理解了你的问题 我目前正在开发一个应用程序,它使用JAX-WSRESTfulWeb服务访问数据。这些数据可以来自各种不同的来源(在我们的例子中是两个不

我正在尝试开发一些RESTfulWeb服务,这些服务必须访问一些后端系统以获取数据。这些后端源可以是以下任意一种:

  • 通过JDBC访问数据库

  • ERP,通过SOAP进行通信

  • 另一个J2EE应用程序,通过SOAP或REST进行通信

  • 在我的级别上,我能做什么才能在我的业务层和DAO之间实现松散耦合?有什么设计模式可以帮助我吗


    非常感谢你的帮助

    我希望我正确理解了你的问题

    我目前正在开发一个应用程序,它使用JAX-WSRESTfulWeb服务访问数据。这些数据可以来自各种不同的来源(在我们的例子中是两个不同的数据库和一个Lucene索引)

    我认为,在不了解您具体情况的情况下,我只能推荐我们使用的典型方法:

    • 代码到接口,而不是实现。因此,为您想要的每个DAO创建一个接口,并让您的业务层引用该接口而不是实现
    • 使用依赖注入(例如Spring框架)来配置和注入那些DAO,这些DAO可以指向多个数据源等。这样,业务层就完全不知道数据来自何处
    虽然这是一本旧书,但其中大部分信息都存在。但我要说的是,这些是标准的企业Java最佳实践

    希望这有助于:

    • :正如您在回答中提到的,始终将bz逻辑与数据访问逻辑分开。我建议在不同的二进制模块中实现不同的层,这将使您能够灵活地在不同的层中部署不同的层(如果您确实需要的话)

    • :业务层具有如何对bz逻辑中的某些实体执行数据访问操作的抽象定义。存储库中的方法始终使用bz逻辑中定义的实体作为参数(存储库始终使用bz语言“对话”)。一旦在bz层中定义了存储库接口,就可以在单独的层中实现它们:数据访问层

    • :在应用程序层(GUI、应用程序服务器等)中,在初始化逻辑(引导)中,可以使用依赖项容器将存储库实现(在数据访问层中定义的实现)注入bz逻辑。很多开源框架都有依赖注入容器

    使用这3种模式,您可以将DA逻辑与bz逻辑分开

    请注意,这是一个非常简短的答案,我建议您花一些时间阅读以下书籍:

    谢谢


    Juanjo

    谢谢Phill。我已经在研究您提供的第一个解决方案。到现在为止,我还不能去春天。还有其他方法引入依赖注入吗?@zombie:是一个轻量级DI解决方案。它基本上是一个JAR文件(如果将AOP Alliance和JSR 330计算为依赖项注入,则为三个),因此它不是侵入性的。@zombie:我同意@darioo-Guice是一个很好的轻量级解决方案,如果您能够集成它的话。您可以将其融入现有的体系结构中。您好,Juanjo,您能否建议如何使存储库独立于存储后端,因为并非所有存储都有事务等。Save的实现方式不同。