Spring - 包结构 - [.../compontent/layer] 与 [.../layer/component]

Spring - Package structure - [.../compontent/layer] vs [.../layer/component]

我们目前有一个更大的 Spring 项目,它由不同的项目组件组成。不幸的是,包装目前比较不利,这就是为什么我想重构整个东西。

我们的基本框架逐层使用,这就是为什么我——至少目前——想在我们的项目中坚持使用它。请问您觉得哪种比较有用:

变体 1:

- src/main/java
     - com/company/core
       - dao
         - CoreThing1Repository
         - CoreThing2Repository
       - domain
         - CoreThing1
         - CoreThing2
       - dto
       - service
         - CoreThing1Service
         - CoreThing2Service
     - com/company/component1
       - dao
         - Thing1Repository
         - Thing2Repository
       - domain
         - Thing1
         - Thing2
       - dto
       - service
         - Thing1Service
         - Thing2Service
     - com/company/component2
       - dao
         - Thing3Repository
         - Thing4Repository
       - domain
         - Thing3
         - Thing4
       - dto
       - service
         - Thing3Service
         - Thing4Service
     - com/company/component3
       - dao
         - Thing5Repository
         - Thing6Repository
       - domain
         - Thing5
         - Thing6
       - dto
       - service
         - Thing5Service
         - Thing6Service

变体 2:

- src/main/java
     - com/company/dao
       - core
         - CoreThing1Repository
         - CoreThing2Repository
       - component1
         - Thing1Repository
         - Thing2Repository
       - component2
         - Thing3Repository
         - Thing4Repository
       - component3
         - Thing5Repository
         - Thing6Repository
     - com/company/domain
       - core
         - CoreThing1
         - CoreThing2
       - component1
         - Thing1
         - Thing2
       - component2
         - Thing3
         - Thing4
       - component3
         - Thing5
         - Thing6
     - com/company/dto
       - core
         - CoreThing1Repository
         - CoreThing2Repository
       - component1
         - Thing1Repository
         - Thing2Repository
       - component2
         - Thing3Repository
         - Thing4Repository
       - component3
         - Thing5Repository
         - Thing6Repository
     - com/company/service
       - core
         - CoreThing1Service
         - CoreThing2Service
       - component1
         - Thing1Service
         - Thing2Service
       - component2
         - Thing3Service
         - Thing4Service
       - component3
         - Thing5Service
         - Thing6Service

在内容方面,我非常喜欢变体1,因为组件更好-但是整个事情既不是按功能封装也不是按层封装?你应该做这样的混合吗?

您会选择哪种变体或您在您的环境中使用哪种变体?

我非常喜欢变体1。原因是您可以更好地控制 class 方法的可见性。

DAO class 就是一个很好的例子。通常,您不希望 DAO class 被其他服务访问,而不是关于相同业务逻辑的服务(在您的情况下是关于相同组件的服务)。如果您使用变体 2,则不能这样做,因为所有方法都必须 public,以便相应的服务能够调用 DAO class。但是您实际上可以在 Java 中使用 no 修饰符或 protected 修饰符来执行此操作。这将使您的代码更具可读性和组织性。此外,添加或删除组件会更容易,因为它的所有逻辑都在同一个包中。