SpringBoot-基础入门笔记(1)
2023-06-15 16:56:04 # Development # Java

SpringBoot-基础入门笔记(1)

前言

非常感谢三根草堂师父的Spring Boot系列教程,内容基本来源于三根草堂师父,也是学习边记录,希望通过学习能写出自己写出一个项目,且对Javaweb类的程序有一定了解,并能够入门Java安全代码审计。

环境搭建

版本要求

JDK : 8+
Maven :3.5.x+

这里我选用2.5.2版本的Spring Boot

新建一个SpringBoot项目

方法一:Idea手动导入

创建一个空的Maven项目,在File-Setting中配置好Maven

image-20210716232948699

maven和其仓库目录根据自己的情况修改。

创建好项目后,会自动生成一个pom.xml

再导入依赖:(相关说明在注解里)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

<!-- Inherit defaults from Spring Boot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId><!--这里SpringBootStarter帮我们集成了很多依赖,必须要继承-->
<version>2.5.2</version><!--这里的版本是根据你的Spring Boot版本来的-->
</parent>
<!-- Add typical dependencies for a web application-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId><!--这里是实现web功能的必须要的dependency,同样有很多依赖集成-->
</dependency>
</dependencies>

<!-- 可以使用mavin插件 可以用来打包等很多方便的操作-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

这里我们还需要配置下Setting.xml文件

image-20210716233557981

打开后在Setting标签下添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--下面是添加阿里云镜像,这样下载依赖更快,不过我在国外使用这个镜像反而无法下载,所以如果不适用直接注释掉就好了-->
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public </url>
</mirror>
</mirrors>
<!--下面是需要指定你的jdk版本,我的是1.8-->
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>

方法二: 网站下载

通过Spring Initilizr配置好下载就行了。

方法三:通过IDEA新建(和方法二差不多)

image-20210716234423763

Maven配置

有时候,如果我们依赖文件导入到一半中止,这时候会有一些错误,那么我们可以用一个清理Maven仓库的脚本, 修改一下仓库路径,然后保存为.bat文件,双击即可清理

1
2
3
4
5
6
7
8
9
10
11
@echo off
rem create by NettQun
rem 这里写你的仓库路径
set REPOSITORY_PATH=E:\Develop\maven_rep
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
echo %%i
del /s /q "%%i"
)
rem 搜索完毕
pause

一个简易的Hello World

Application和Controller

image-20210716234550092

src-main-java下新建一个package,然后新建我们的HelloApplication Class,再新建一个Controller package 来存放我们的Controller classes,需要注意的是,我们的Controller Class必须放在application class的子目录里。注意,通过Spring Initilizr网站上直接下载的直接就有这些class了。

Application Class的代码:

1
2
3
4
5
6
7
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class,args);

}
}

Controller的代码:

1
2
3
4
5
6
7
8
9
10
11
//@Controller
//@ResponseBody 结果返回到响应体,如果没有的话是会返回到新的页面
@RestController//相当于Controller+responseBody
public class HelloController {
@Value("${name}")
private String name;
@RequestMapping("/hello")//this is to deal with the request of "/hello"
public String hello(){
return "hello world";
}
}

RestController

Controller Class需要加上@Controller

如果要让数据返回到response bodyimage-20210716235326711,需要使用@ResponseBody

@RestController 相当于 @Controller+@ResponseBody,所以我们也可以直接用这个代替

@RequestMapping表示处理请求

jar打包运行

打包

pom.xml中加入以下代码

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 可以使用mavin插件 可以用来打包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

然后在Idea右侧的Maven中双击package即可

运行

target文件夹中可找到我们生成的jar文件,在当前文件所在目录的cmd中用java -jar filename运行起来即可

版本锁定

Spring Boot所继承的spring-boot-starter-parent这个副工程为我们对常用的依赖进行了版本锁定(在父工程的pom.xml文件中)。

我们可以通过直接指定版本号(在我们的pom.xml)和覆盖properties配置来修改依赖的版本(在父工程的pom.xml文件中)。。

Starter机制

一个starter针对一种特定的场景,内部引用了该场景所需要的依赖,所以我们不需要单独引入多个依赖。

命名规律
官方starter都是以 spring-boot-starter 开头后面跟上场景名称。例如:spring-boot-starterdata-jpa
非官方starter则是以 场景名-spring-boot-starter 的格式,例如:mybatis-spring-boot-starter

非官方的starter是不会被Spring Boot的父工程进行版本指定的,所以我们需要指定version

YAML文件配置(重要)

介绍

YAML是以yml为后缀的文件,用来完成XML所完成的任务,易于阅读且简单明了。yaml文件应该放在resources文件夹中,如application.yml

约定

  • key: value冒号后面必须有一个空格

  • 用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的

  • 缩进时不允许使用TAB键,只允许用空格

  • 命名时,lastName和last-name都可以

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
name1: sangeng//可以不用引号
#单引号中\n不起作用
name2: 'sangeng \n caotang'
#双引号中\n要起作用
name3: "sangeng \n caotang"
age: 15
flag: true
date: 2021/07/16

#object的attribute和value,也可代表Map:
student:
name: leihehe
age: 21
#如果要写成一行,如下:
student: {name: leihehe,age: 21}

#数组、list、set:
pets:
- dog
- pig
- cat
#list如果要写成一行,如下:
pets: {dog,pig,cat}
#数组写成一行,如下:
pets: [dog,pig,cat]
#修改服务器端口,如果myPort没有被设置,就会被设为88
server:
port: ${myPort:88}
myPort: 8080

Spring Boot读取YML

@Value注解

该注解只能获取简单类型的值(8种基本数据类型以及其包装类,String,Date)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
public class HelloController {
@Value("${name}")//此处从yaml文件中读取到name的值,并赋值给下面的变量
private String name;
@Value("${student.age}")//从student这个object中获取age的值,并赋值给下面的变量
private String age;

@RequestMapping("/age")//处理/age访问请求
public String age(){
return age;
}
@RequestMapping("/test")//处理/test访问请求
public String test(){
return name;//返回name
}
}

加了@Value的Class必须要交由Spring容器管理,如此处的@RestController

@ConfigurationProperties 注解 与Lombok插件

使用@ConfigurationProperties的Class必须要交由Spring容器管理。

yml文件中:

1
student2: {name: jack,age: 21}

Student Class中:

1
2
3
4
5
6
7
8
9
10
11
12
@Data//根据我们的attribute帮我们生成set/get方法
@NoArgsConstructor//生成空参constructor
@AllArgsConstructor//生成传参constructor
//以上都是Lombok插件的作用
@Component//把该类交给Spring容器管理
@ConfigurationProperties(prefix = "student2")//设置前缀

public class Student {
private String name;//此处的attribute必须和yaml file里的key名字一样才可以赋值
private int age;
//attribute会自动被赋值
}

要求对应的属性要有set/get方法,而此处我们用Lombok这个依赖帮我们自动完成这件事,所以我们不需要手动生成set/get方法

当然,我们还需要安装Lombok 插件

1
2
3
4
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

HelloController

1
2
@Autowired//因为创建Student类的instance,所以用autowired可以自动注入,从Spring容器中获取数据,赋值给下面的变量
private Student student;

@ConfigurationProperties 配置提示

另外,如果我们使用了@ConfigurationProperties注解,我们可以增加如下依赖,这样在写配置的时候会有提示

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

重启idea即可

YML和Properties转换

application.yml需要改成application.properties

在线yaml转properties

问题解决

依赖冲突

造成原因

A依赖B(低版本)

C依赖B(高版本)

若你先引入A,那么低版本的B会被引入,再引入C后,C就找不到高版本的B,就会出现依赖冲突

解决方法

下载Maven Helper插件,重启idea后,打开pom.xml,下面就有Dependency Analyzerrefresh后可以找到冲突项,然后选择低版本的,右键exclude,再次刷新后问题解决。

修改依赖后如何生效?

很简单,右上角有一个Maven的图标,load一下change就好了

Reference

三根草堂师父的Spring Boot系列教程