0%

SpringBoot学习笔记

起步

创建项目

在IDEA中选择File->New->Project->Spring Initializr,勾选Web/Spring Web。或者File->New->Module,创建一个Maven项目。

pom.xml

根目录的pom.xml应该是如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.xuranus</groupId>
<artifactId>springdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springdemo</name>
<description>springdemo</description>
<properties>
<java.version>11</java.version>
</properties>

<dependencies>
<!--SpringBoot Web项目起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<!--SpringBoot 测试起步依赖,默认有,删除需要同时删除test文件夹-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<build>
<plugins>
<!--SpringBoot项目打包依赖-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

spring-boot-starter-parent定义了项目的父级结构,SpringBoot相关组件无需手动配置,他们的版本号都被spring-boot-starter-parent管理着,可以在IDEA中Ctrl+鼠标查看组件版本号。对于想替换的组件,在dependencies中覆盖。

目录结构

项目创建完成后,目录结构如下:

src/main/java/com/xxxx/xxx/             # SpringBoot项目目录
- SpringDemoApplication.java # SpringBoot启动入口
src/main/resources/
- static/ # 防止网页静态文件,如*.html,*.js,*.css
- templates/ # tymeleaf模板文件
- application.properties # SpringBoot核心配置文件
src/test/java/com/xxx/xxx/ # 测试文件
target/ # 编译后的文件
pom.xml # maven项目配置

Application类

SpringDemoApplication.java是SpringBoot项目入口,必须有@SpringBootApplication注解,用于开启Spring自动配置。项目代码必须放到Application类所在目录或下级目录,才能被Spring容器扫描到并托管。

@SpringBootApplication // Springboot核心注解,用于开启Spring自动配置
public class SpringDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDemoApplication.class, args);
}
}

Controller

Spring中的Controller用于标记HTTP路由,并在其中实现对每次请求的处理。Controller类需要在类上标记@Controller

路由以方法定义,并打上响应注解。

  • @GetMapping:只接受GET请求
  • @PostMapping:只接受POST请求
  • @RequestMapping:接受GET和POST请求
  • @ResponseBody:返回是字符串或者JSON,如果不写会默认返回对应模板
// IndexController.java
@Controller
public class IndexController {

// 返回字符串
@RequestMapping("/string")
@ResponseBody
public String stringResponse() {
return "response a string";
}

// 返回JSON {"key":"value"}
@RequestMapping("/json")
@ResponseBody
public Map<String,String> jsonResponse() {
Map<String,String> response = new HashMap<>();
response.put("key","value");
return response;
}

// 获取GET参数 http://localhost:8080/getParams?number=42&word=hello
@RequestMapping("/getParams")
@ResponseBody
public Map<String, Object> getParams(String word, Integer number) {
Map<String,Object> response = new HashMap<>();
response.put("word",word);
response.put("number", number);
return response;
}

// 获取POST参数
// curl http://localhost:8080/postParams -H "Content-Type: application/json" -X POST -d '{"data":"hello","ok":true}'
@RequestMapping("/postParams")
@ResponseBody
public Map<String, Object> postParams(@RequestBody Map<String, Object> request) {
Map<String,Object> response = new HashMap<>();
response.put("data", (String)request.get("data"));
response.put("ok", (Boolean)request.get("ok"));
return response;
}
}

配置文件

application.properties作为SpringBoot唯一的配置文件,可以在其中设置所有配置,无论是Redis,MySQL的连接参数,还是端口号,上下文路径,无需像SpringMVC中在各处做复杂的配置,SpringBoot将它们全集中于此处。

一般它的形式如下:

# 内嵌tomcat端口号
server.port=8080

# servelet上下文路径
server.servlet.context-path=/

YAML和YML

application.properties可以用application.yaml或者application.yml配置文件替代。*.yml或者*.yaml文件是另一种形式的配置文件,可以有层级的表示出相关配置,上文配置文件用application.yml来写等价于这种形式:

server:
port: 8080
servlet:
context-path: /

需要这种层级的配置文件需要注:

  • 意冒号是半角字符,冒号后有一个空格
  • 配置条目末尾要注意没有空格,否则空格也会被识别为字符
  • 配置中的字符串不需要写引号
  • application.propertiesapplication.yml同时存在,会优先使用application.properties

自定义配置项

对于用户自定义的配置,如项目是一个通用的学校的管理系统,只要在在学校的名称和人数上做特别配置。用户配置也可以写在SpringBoot配置文件中:

# 用户自定义配置
school:
name: NEU
studentNumber: 1000

有两种方式读取配置文件:

  1. 配置类

新建一个配置类SchoolConfig,声明@Component注解,将它托管给Spring容器。@ConfigurationProperties(prefix = "school")指定它是一个配置类,且从"school"的条目中读取同名的成员变量。补全getter和setter

// SchoolConfig.java
@Component //托管给Spring
@ConfigurationProperties(prefix = "school") //配置类
public class SchoolConfig {

private String name;
private int studentNumber;

// getter & setter
public int getStudentNumber() { return studentNumber;}

public String getName() { return name; }

public void setName(String name) { this.name = name;}

public void setStudentNumber(int studentNumber) { this.studentNumber = studentNumber;}
}


在项目启动后,可以用@Autowired自动实例化该类,拿到它的成员变量。例:
// IndexController.java
@RequestMapping("/school")
@ResponseBody
public Map<String, Object> schoolInfo() {
Map<String,Object> response = new HashMap<>();
response.put("schoolName", schoolConfig.getName());
response.put("studentNum", schoolConfig.getStudentNumber());
return response;
}

这种方法可以直接将一类配置作为一个Bean读取,适合多个配置一组的场景。

  1. @Value注解
    第二种自定义配置读取的方法是用@Value注解直接将配置注入到变量中。
    // IndexController.java
    @Value("${school.name}")
    private String schoolName;

    @Value("${school.studentNumber}")
    private int studentNum;

    @RequestMapping("/school")
    @ResponseBody
    public Map<String, Object> schoolInfo() {
    Map<String,Object> response = new HashMap<>();
    response.put("schoolName", schoolName);
    response.put("studentNum", studentNum);
    return response;
    }
    这种方法不再要求变量和配置同名,适用于读取零散的单个配置。

多环境配置

在开发过程中往往用到三种环境:开发环境,测试环境,生产环境。各个环境用到的配置文件也不一样,SpringBoot支持预设多种环境下的配置文件,按照application-XXX.properties来命名。一般项目需要配置三个环境下的配置:application-dev.propertiesapplication-test.propertiesapplication-release.properties

application.properties还是需要存在的,用它指明当前使用的配置:

spring.profiles.active=dev # 当前使用dev配置,将会读取application-dev.properties中的配置

MyBatis

<dependencies>
<!--MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>

<!--Springboot整合MyBatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
Disqus评论区没有正常加载,请使用科学上网