5

SpringBoot学习笔记

 2 years ago
source link: https://xuranus.github.io/2022/01/08/SpringBoot%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SpringBoot学习笔记

发表于

2022-01-07 更新于 2022-01-12

Disqus: 0 Comments 7k 6 分钟

在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

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

新建一个配置类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>

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK