Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java包结构中的模块与层_Java_Architecture_Aop_Packages - Fatal编程技术网

Java包结构中的模块与层

Java包结构中的模块与层,java,architecture,aop,packages,Java,Architecture,Aop,Packages,我以前把所有东西都放在这样的包里: com.company.app.module1 com.company.app.module2 但这使得基于包的AOP切入点变得困难,并导致需要IDE才能理解的大型包 所以现在我意识到我需要一个更深层的包结构,但我总是被撕裂。给模块优先权,像这样 com.company.app.module1.domain com.company.app.module1.logic com.company.app.module1.persistence com.compan

我以前把所有东西都放在这样的包里:

com.company.app.module1
com.company.app.module2
但这使得基于包的AOP切入点变得困难,并导致需要IDE才能理解的大型包

所以现在我意识到我需要一个更深层的包结构,但我总是被撕裂。给模块优先权,像这样

com.company.app.module1.domain
com.company.app.module1.logic
com.company.app.module1.persistence
com.company.app.module2.domain
com.company.app.module2.logic
com.company.app.module2.persistence
com.company.app.domain.module1
com.company.app.domain.module2
com.company.app.logic.module1
com.company.app.logic.module2
com.company.app.persistence.module1
com.company.app.persistence.module2
或者像这样优先选择图层

com.company.app.module1.domain
com.company.app.module1.logic
com.company.app.module1.persistence
com.company.app.module2.domain
com.company.app.module2.logic
com.company.app.module2.persistence
com.company.app.domain.module1
com.company.app.domain.module2
com.company.app.logic.module1
com.company.app.logic.module2
com.company.app.persistence.module1
com.company.app.persistence.module2

每个模块的优缺点?

通过模块组织,开发人员可以将功能集作为交付单元,而不是技术基础设施。如果您根据模块分解代码库,那么扩展代码库可能会更容易一些——一些开源项目的代码我已经看过了(比如Artifactory和Continuum),它们是以这种方式组织的,但我还没有看过足够多的资料来了解这是否是一种普遍趋势


不过,这可能取决于代码库的大小。

我承认,我从来没有真正做过很多(正式的)AOP

就我个人而言,我会把模块放在第一位


这样,如果您以后将模块拆分为几个JAR/WAR文件(例如,拆分为单独的maven项目),则它们已经位于按模块拆分的正确目录结构中。

我将按层组织包层次结构,以允许您的工具工作。每个模块都会进入自己的项目和自己的源文件夹。这使IDE和开发人员可以轻松地进行面向模块的分组,但运行时工具可以轻松地首先对模块进行面向层的分组

我有一个项目,最初是第一层的,但它变得太庞大,无法阅读和维护,所以我们对它进行了重构。它也使用AOP——没有任何问题。我们只是在包定义的中间使用了<代码> ./COD>(我们使用AspectJ语法的Spring AOP)。下面是它的样子:

execution(* com.foo.app.modules..service..*.*(..))

这同时匹配了
模块.module1.service
模块.module2.service

我宁愿将模块放在第一位,但在我看来,这样做必须处处引用所有内容。这可能是开发人员如此困惑的原因。

这也是隔离与代码共享之间的选择。如果您使用模块结构(将所有域对象、服务、DAO等单独的功能放在自己的包中),那么您将把属于所有模块的东西放在哪里?您最终将创建一个共享包,其中还包含所有共享域对象、服务、DAO等等。如果有很多共享代码,它会变得臃肿,最终可能会将它们分解成层,真的。这是我至少面临的一个问题:/