具有接口的Spring目录结构(最佳实践)

时间:2019-02-12 18:17:19

标签: java spring hibernate spring-boot

我当前正在编写我的第一个Spring应用程序(Spring Boot +休眠)。我在他们的文档here中检查了最佳做法目录结构。这说得通。

问题1:

我有一个扩展了几个子类的interface(或Abstract class),所以对于父类,我只需要一个@Repository。我决定这样做:

com
 +- example
     +- myapplication
         +- Application.java
         |
         +- message
         |   +- AbstractMessage.java
         |   +- IMessageRepository.java
         |   +- MessageRepositoryImpl.java
                +- messageTypeA
                |  +- messageTypeA.java
                |  +- messageTypeAService.java
                +- messageTypeB
                |  +- messageTypeB.java
                |  +- messageTypeBService.java

问题2:

现在我有一个新的entity要保存,名为Group。因此,我可以做的是在与Group相同级别上添加一个Message目录。但是,此Group实际上是Message的一部分(就像逻辑上一样),因此,如果它是同一message目录的一部分,则实际上是有意义的(唯一原因我们之所以将它们保存为不同的实体,是因为以这种方式导出分析更有意义)。此外,我什至使用相同的MessageRepository保存它(我只是在界面中添加了第二种方法,如下所示:)

public interface MessageRepository {

    void insert(AbstractMessage message);

    void insert(AbstractMessage message, AbstractGroup group);
}

像下面这样的东西好吗?还是每个 entity都有自己的软件包?我在想这个吗?

com
 +- example
     +- myapplication
         +- Application.java
         |
         +- message
         |   +- AbstractMessage.java
         |   +- IMessageRepository.java
         |   +- MessageRepositoryImpl.java
             |  +- messageTypeA
             |     +- messageTypeA.java
             |     +- messageTypeAService.java
             |  +- messageTypeB
             |     +- messageTypeB.java
             |     +- messageTypeBService.java
             |
             +- group
                +- AbstractGroup.java
                +- GroupTypeX.java // same service as message, just different entity
                +- GroupTypeY.java // same service as message, just different entity

2 个答案:

答案 0 :(得分:2)

这更多是基于观点的,但是我想给您一些建议。

首先,命名
接口上的I前缀是IBM识别它们的“古老”技术。拜托,不要那样做,它是多余的,在新鲜的环境中没有意义。什么是I-MessageRepository ?!
您会在Eclipse RCP项目或IBM的任何产品中找到这种命名约定。

然后是实现名称。不要使用后缀Impl,它不会对正在阅读或编辑您的代码的人说任何话。
给它起个名字,说明它的用途或领域范围。

ActiveMQMessageRepository
FileMessageRepository
TcpMessageRepository

第二,Repositories
存储库应管理一种类型的对象,但不能超过一种。使用Services来协调多个Repositories。这将使每个人都更容易调试,并且将使许多代码分离。


第三,packages
尝试始终保持扁平的包装结构。扁平结构更易于维护,更易于观察,更易于理解。不要创建数十个子包,例如

- messages
   - services
       MessageService
     - implementations
        ...
   - repositories
       MessageRepository
     - abstract
         AbstractMessageRepository
     - implementations
         TextMessageRepository
   - exceptions
     - runtime
     - checked
         UnsupportedMessageException

可怕而无用。而且您无法利用软件包的可见性

因此,将messagesgroups放在单独的包装上,并给它们自己的Repository

从包公开接口,而不是具体的实现。(如果可能)

答案 1 :(得分:0)

我同意上面的@LppEdd答案。只是一个问题,你说什么意思

  

(将它们保存为不同实体的唯一原因是,以这种方式进行分析更有意义)。