为什么要进行项目模块化?
因为项目可能会很庞大,功能会很复杂,在单体项目中包容整个业务很明显会很大,在进行项目分布式的时候,也没办法很好地一次性分离,所以需要在设计架构的时候就将各种业务模块化出来
模块化的程度
在写代码的时候,我们都喜欢将业务经常用到的代码分离出来,好让相似的业务也能直接用上;
并且在这些常用到的代码中,会分成基本组件,这些组件可能是其他库中直接拿过来的,所以要和项目兼容的时候常常需要进行简单地封装;
封装好组件之后,就可以进行业务的编写,所以在模块化的结构中一般会包含以下模块
- utils模块,第三方的库和包的调用代码
- common模块,将第三方的库进行简单地封装,可以让项目的业务层进行调用
- statis模块,静态资源,项目中会有logo图片和html页面,让项目可以直接使用
- dao模块,数据库层的模块,基于mybatis的技术,可以用到mapper对sql语句进行分离,让sql语句不要侵入到业务层,单独放在xml文件中,让业务层调用
- web模块,业务模块,包括repo,service,web层的结构。
目前来说,web是最顶层的模块,可以将主要的启动程序放在该模块中,统一启动
如何用springBoot进行模块化
模块化最主要的是建立父模块的结构,和同级模块的依赖。
图示:
以root模块为父节点,节点下有五个模块,web模块依赖了dao和static和common模块
common模块依赖了utils模块
maven如何配置模块化
- 在模块管理中添加模块,例如选择springBoo的创建
- 创建后得到如下模块,frame模块相当于root模块,即父节点
- 模块创建好以后,就可以进行pom的配置
首先进行父模块的配置 - 接下来配置各个子模块的pom文件
这个是最底层的模块utils
这个common不是最底层的模块,所以可以依赖其他的模块,common依赖utils
web 模块是最上层的,并且启动程序也放在该模块中,用于启动项目,所以这个模块可以依赖后面 - 配置各个模块的<build>
root模块中配置为maven的模式
子模块中低层的模块同样也配置maven的模式
子模块中的高层模块就配置为springBoot,
并且配置程序入口,在依赖中需要将依赖模块的打包类型一起配置好
创建好依赖之后就可以调用代码了吗?
不一定!
假设在utils模块中有个工具类KO,放在com.example的包名下,在common模块中,就能直接调用得到。
但是如果有个工具类Out,直接放在java根目录中,并没有任何的包名包裹着,这时候common模块是没办法调用的。
所以模块里的代码都需要放在包下,否则其他模块无法调用。
如果有多个模块都有controller层的代码,如何得到除了web以外其他模块的控制器路由
以上配置完成之后,在web层的控制器就可以直接用,但是如果再配置多一个web层,它的路由一般来说是没办法使用的。
所以需要让springBoot去扫描其他module下的controller,只需要在@SpringApplication注解里添加一个属性就能完成
进行打包出现过的问题
①
在执行mvn clean package时候发生的错误
只需要跳过test阶段就行mvn clean package -Dmaven.test.skip=true
https://www.cnblogs.com/javabg/p/8026881.html
②没有在子模块中的主模块 web 中配置打包类型时,就会发生找不到模块的异常
如果依赖模块是war类型,就必须配置,否则将会报找不到模块的异常
参考https://blog.youkuaiyun.com/qq_37604508/article/details/83047198