springboot+maven-多模块项目搭建
项目搭建
1.建立springboot父工程
2.父工程的type必须选择Maven Pom,项目目录不存在src目录,只有pom.xml
3.父工程的依赖可以在后期使用DependensManager进行统一管理
4.一路next,查看项目结构
5.父工程右键,新增子模块moudle
6.选择普通maven项目
7.继续新建子模块,步骤同上
8.检查父项目pom.xml文件
- 父工程的标签为pom
- 父工程存在包含了所有的子工程,方便统一打包
- springboot类型的父工程标签为spring-boot-starter-parent
- 父工程不需要使用其他的依赖,所以推荐使用标签进行依赖包的版本管理,在子模块中使用进行具体的引用
- 在父工程中直接使用引用的依赖将会传递到各个子模块中,而使用管理的依赖不会被引入到项目中,更不会被传递到子模块中去,因为标签只起到管理版本的作用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 https:///xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>web</module>
<module>dao</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>parent</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
9.加入springboot-web依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
10.把子模块dao作为依赖加入到子模块web的pom中,子模块web的pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
<parent>
<artifactId>parent</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web</artifactId>
<dependencies>
<dependency>
<artifactId>dao</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
11.在dao项目中建立User类和UserDao类
public class User {
public String name;
public String password;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String name, String password) {
= name;
this.password = password;
}
public User() {
}
}
import com.li.entitys.User;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public User getUser(){
return new User("liming","123");
}
}
12.web项目中建立controller和springboot启动类,注意启动类的位置必须要高于其他类的位置。在多模块中使用spring注入的时候,idea可能会报红,但不影响使用,可以在设置中更改告警级别(还有一种可能,就@Repository和@Mapper的注解使用不当,见16)
13.在编写程序期间,手误删除了子项目的iml文件,导致一直找不到类,最后重新建立了子模块解决
14.使用mybatis的时候,由于在mapper接口中添加的注解时@Respository,导致在编写代码的时候没有报错,启动类上点击springboot扫描放大镜也是可以看到mapper的类,但是在启动项目的时候会报找不到mapper的错误
Consider defining a bean of type 'com.study.mybatis.mappers.UserMapper' in your configuration.
后来百度,在启动类上加入扫描的路径,也不行
@SpringBootApplication(scanBasePackages = {"com.study"})
15.把@Respository注解改为@Mapper,并去掉启动类的scanBasePackages就可以自动注入了(或者在启动类上加入@MapperScan(“com.study”))
16.在用idea写一个实现类时引用了mapper类的来调用dao层的处理,使用@Autowired注解时被标红线,找不到bean。
解决办法:在mapper加@mapper或者@repository注解。
这两种注解的区别在于:
1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中。
17.@RestController 等于 @ResponseBody+@Controller 只响应内容到前端,但不能跳转页面,在使用RestController("/get")注解的时候,浏览器访问总司404,后来换成@RestController+@RequestMapping("/get")就可以了
18.@RestController和@Controller的value属性仅表示该Controller类在spring 的bean池中的名称,不具备路由的功能,需要搭配@RequestMapping来实现路由