Java 将现有项目与外部开源JAR分离的实践/策略

Java 将现有项目与外部开源JAR分离的实践/策略,java,design-patterns,architecture,open-source,Java,Design Patterns,Architecture,Open Source,我的系统通过Hibernate/JDBC连接到Oracle。我想使用抽象对其进行重构,以使其实现与Hibernate库分离。这是一个备份,有一天团队可以切换到另一个JPA实现,而无需痛苦地将核心业务逻辑更改为带有新JPA实现的适配器。这样做有什么建议 顺便说一下,我想从大师那里得到一些建议,将现有项目与外部开源JAR分离的常见做法/策略是什么?JPA已经是一个独立的API了。如果您的团队使用JPA,那么您应该已经能够毫不费力地从hibernate切换。您应该减少依赖性。您的服务类(包含业务逻辑的

我的系统通过Hibernate/JDBC连接到Oracle。我想使用抽象对其进行重构,以使其实现与Hibernate库分离。这是一个备份,有一天团队可以切换到另一个JPA实现,而无需痛苦地将核心业务逻辑更改为带有新JPA实现的适配器。这样做有什么建议


顺便说一下,我想从大师那里得到一些建议,将现有项目与外部开源JAR分离的常见做法/策略是什么?

JPA已经是一个独立的API了。如果您的团队使用JPA,那么您应该已经能够毫不费力地从hibernate切换。

您应该减少依赖性。您的服务类(包含业务逻辑的类)应该依赖于数据访问对象接口,而不是特定的DAO实现。大概是这样的:

public class ImAServiceBean {

    private EntityDAO entityDAO;

    private void someBusinessLogic(){
        entityDAO.createInstance(...);
如果DAO接口是这样的:

 public interface EntityDAO {

    void createInstance (...);
    void updateInstance(...);

现在您正在使用EntityHibernateDaoImpl之类的东西,但是如果您想将持久性框架更改为MyBatis,您可以构建EntityMyBatisDaoImpl(实现EntityDAO)并在服务类中使用该类,而不做任何更改(因为您使用的是某种依赖项注入)。如果您使用JPA、JDO或任何持久性技术,情况也是如此:您的业务逻辑只依赖于一个简单的接口,该接口可以实现,但任何持久性技术,甚至JDBC直接依赖于标准和流行的开源库都是可以的。你不应该认为这是个问题。例如,我有一个庞大的代码库,这取决于joda时间、google guava等。现在,就你的情况而言,以下是我的观点

  • 从一个JPA实现转移到另一个JPA实现的可能性非常小,因为当您熟悉某个特定的实现时(是的实现,因为您可能希望优化某些内容,或者您正在寻找标准JPA api中缺少的某些功能)这需要一些时间,而且您真的不想花同样的精力学习其他实现(即使您愿意,业务部门也不允许您;-))

  • Spring已经抽象了大多数常用的API,如JPA、JMS等,所以我建议您考虑这个选项


  • 谢谢您能展示一些最常见的设计模式(比如包装器、适配器、桥接器等)吗?您曾经将它们与外部库(平铺、轴、显示标签等)分离(如果这个问题如此笼统,那么很抱歉)。您能说得更具体一点吗?困扰你的依赖性是什么?在什么情况下?发布的答案是一个针对接口编程的示例:不要忘了DAOAPI和实现应该在单独的库中,只有这样解耦才能完成。Google-guava是一个很棒的多功能库。谢谢你让我知道这件事。正如你所证实的,直接依赖通常是可以的。然而,我们偶尔需要一个抽象。例如,目前我们使用一个缓存库,但在未来,一个新的高性能缓存库将出现。然后,松耦合起作用。