多模块的好处
将项目分为多个模块是有用且易于维护的。可以轻松编辑或删除项目中的模块,而不会影响其他模块。当我们需要分别部署模块时,这很有用。
多模块拆分的方式
- 按照单模块拆分为多个子模块,比如将MVC三层架构拆分为 xxx-service,xxx-dao,xxx-model,这种拆分感觉意义不大
- 按照业务模块拆分,这种模式使用的比较多,也比较多见。比如可以将某块业务做成starter模块,这样不仅自身可以用到,也可以推送到公司maven私库被其他项目引用。
多模块目录结构
理解多模块目录结构就是理解多模块的层级关系,而要明白多模块的层级关系就要明确项目Application主启动类放在哪里。这很重要,因为这影响到SpringBoot启动类的包扫描范围。
回顾下知识点:
SpringBoot启动类的包扫描范围:
SpringBoot其实有默认的包扫描机制,启动类所在的当前包以及包的子类都会默认被扫描。
如果bean不在启动类所在包及其包的子类,就有可能因为扫描不到引起注解失败
要么要想定义的类能被项目扫描到,要怎么做呢?
方法一:在启动类的SpringBootApplication注解中配置scanBasePackages即可
`@SpringBootApplication(scanBasePackages = "org.sang.service")`
方法二:在启动类里添加@ComponentScan注解配置basePackages
`@ComponentScan(basePackages = {"org.sang.bean","org.sang.service"})`
搭建步骤
我们按照这边文章来搭建多模块Maven项目
SpringBoot+Mybatis多模块(module)项目搭建教程
步骤1: 创建一个名为 shameless的 Maven项目。 shameless就是一个父模块
然后将无用的.mvn目录、src目录、mvnw及mvnw.cmd文件删掉,只留下pom.xml
步骤2: 创建一个名为 application的子模块
在com.sherlock.shameless的包下放项目启动类:
package com.sherlock.shameless;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
此时启动项目会报错:
要解决这个问题需要至少定义一个endPoint,比如下面这段代码:
@RestController
@RequestMapping("demo")
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("test")
public String test() {
return "Hello World!";
}
}
那么将endPoint代码定义放在哪里呢? 要知道现在Application所在的包是com.sherlock.shameless; 如果是定义在与这个包不同的地方,比如com.sherlock.web,那么就无法被默认扫描到,需要修改包扫描的位置,回顾上面提到的知识点。
另一种方式是我们可以把Controller类放在一个单独的子模块中,定义一个web模块,这个模块的package叫做com.sherlock.shameless.web,从包名可知是启动类所在包的子包,能被启动类扫描到
步骤3: 创建一个名为web的子模块
web模块创建完成启动项目还是报错:
Disconnected from the target VM, address: '127.0.0.1:56091', transport: 'socket'
除了创建web模块之外,还需要让application模块能引用到web模块,索引在pom文件加上:
此时再启动项目就能启动成功