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

时间:2012-03-02 02:47:31

标签: java design-patterns architecture open-source

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

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

3 个答案:

答案 0 :(得分:4)

直接依赖标准和流行的开源库是可以的。你不应该认为这是一个问题。例如,我有一个很大的代码库,它取决于joda-time,google-guava等。现在,根据你的情况,以下是我的观点

  1. 从一个JPA实现转移到另一个实现的可能性非常小,因为当您熟悉特定实现时(是实现,因为您可能希望优化某些内容,或者您​​正在寻找某些功能)从标准的JPA api中遗漏了它需要一些时间,你真的不想花费同样的努力来学习其他实现(即使你想要,业务也不会让你; - ))。

  2. Spring已经抽象了大多数常用的API,比如JPA,JMS等。所以我建议你看一下这个选项。

答案 1 :(得分:2)

您应program against interfaces减少依赖关系。您的服务类 - 包含业务逻辑的服务类 - 应该依赖于数据访问对象接口而不是特定的DAO实现。像这样:

public class ImAServiceBean {

    private EntityDAO entityDAO;

    private void someBusinessLogic(){
        entityDAO.createInstance(...);

DAO界面是这样的:

 public interface EntityDAO {

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

现在你正在使用像EntityHibernateDaoImpl这样的东西,但如果你想把你的持久性框架更改为MyBatis,你可以构建一个EntityMyBatisDaoImpl(实现EntityDAO)并在你的Services类中使用该类而不做任何改动(asumming you'重新使用某种依赖注入)。如果您使用JPA,JDO或任何持久性技术,同样的事情:您的业务逻辑仅依赖于普通接口,并且该接口可以实现,但任何持久性技术,甚至是JDBC

答案 2 :(得分:1)

JPA已经是一个单独的API。如果你的团队使用JPA,那么你应该已经能够毫不费力地从休眠状态切换。