🌻🌻目录
- 一、快速入门:创建第一个SpringBoot 工程
- 1.1 点击File--->New--->Project...
- 1.2 选择版本和依赖的相关骨架包
- 1.3 设置项目保存目录
- 1.4 项目创建完成,工程主界面如下
- 1.5 项目说明
- 1.6 启动项目
- 1.7 编写 HelloController
- 二、SpringBoot 基于web应用开发
- 2.1 SpringBoot json支持
- 2.2 SpringBoot 请求传递参数
- 2.1.1 第一类:请求路径传参
- 2.1.2 第二类:@RequestBody 参数
- 2.3 SpringBoot 静态资源
- 2.3.1 默认静态资源映射
- 2.3.2 自定义静态资源访问
- 三、SpringBoot 属性配置
- 3.1 项目默认属性配置文件所在位置及配置实例
- 3.2 实体类属性赋值
- 3.3 自定义配置文件
- 3.4 多环境配置文件
Spring Boot 涉及底层核心源码,建议先看上手篇
一、快速入门:创建第一个SpringBoot 工程
前提电脑安装了jdk,maven并且在IDEA中作了配置
1.1 点击File—>New—>Project…
创建可以参考 Spring Boot
创建SpringBoot时候报错解决,------------------------- 官网创建下载导入地址
输入maven属性,注意Artifact不要出现大写、特殊字符.
1.2 选择版本和依赖的相关骨架包
选择SpringBoot版本,选择项目需要依赖的相关骨架包
注意:一定要选择springBoot版本2.1.9(没有的话选择低版本,下面手动改)
1.3 设置项目保存目录
1.4 项目创建完成,工程主界面如下
手动修改版本:
1.5 项目说明
- (1)默认有个
DemoApplication
类,里面是spring boot的载入函数- (2)resource目录下有个application.properties文件,这个是Spring boot的配置文件
- (3)test目录下有个测试类
DemoApplicationTests
,这个是spring boot的单元测试- (4)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.1.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!-- Generated by https://start.springboot.io --><!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn --><groupId>com.gansu</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>1.8</java.version></properties><dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
注意观察
- 一个继承
spring-boot-starter-parent
,
两个依赖,
spring-boot-starter-web
web 项目依赖必须,spring-boot-starter-test
spring boot 项目单元测试依赖
注意,很多人配置的maven加速镜像,其中很多配置的阿里云maven镜像,在这会有找不到最新Springboot相关包的问题,也可以把加速镜像指向华为云:
2. Maven镜像配置
1.6 启动项目
通过spring boot的启动类,这里是DemoApplication,选中类,右键选择–>Run‘DemoApplication
’
在控制台出现如下输出:
找到如下文字,表明SpringBoot已经成功启动:
- tomcat启动在8080端口,http协议,启动花费了3.184秒
打开浏览器,输入地址:http://localhost:8080
,出现如下画面
出现上图404错误是正常的,因为我们什么都没写。
1.7 编写 HelloController
注意HelloController所在包,必须在com.gansu.demo包,或者子包下面。
package com.gansu.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloController {@RequestMapping("/hello")@ResponseBodypublic String hello(){return "Hello Spring boot!!!";}
}
重启应用,看控制台输出:
重启发现刚才写的hello已经映射出来了
访问http://localhost:8080/hello
二、SpringBoot 基于web应用开发
2.1 SpringBoot json支持
(1)、创建实体bean
Car
Lombok使用
- 1、导入依赖库
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version>
</dependency>
- 2、安装插件
- 3、在实体bean使用插件注解或直接生成
@Data
//get 、set
@AllArgsConstructor
//所有参数的有参数构造函数
@NoArgsConstructor
//无参数构造函数
package com.gansu.pojo;import java.io.Serializable;public class Car implements Serializable {private Integer id;private String name;private Float price;public Car() {}public Car(Integer id, String name, Float price) {this.id = id;this.name = name;this.price = price;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}
}
(2)、创建Controller
CarController
package com.gansu.controller;import com.gansu.pojo.Car;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/car")
public class CarController {@RequestMapping("/findOne")public Car findOne(){Car car = new Car(1,"喵喵",23F);return car;}
}
说明:@RestController 注解,等于@Controller 与 @ResponseBody 一起使用
(3)、测试获取单个对象json
开启postman,设置发出get请求,请求地址:
http://localhost:8080/car/findOne
(4)、修改Controller CarController新增返回list集合方法
@RequestMapping("/getAllCar")
public List<Car> getAllCar(){ArrayList list = new ArrayList();Car car1 = new Car(1,"喵喵1",231F);Car car2 = new Car(2,"喵喵2",232F);Car car3 = new Car(3,"喵喵3",233F);Car car4 = new Car(4,"喵喵4",234F);Car car5 = new Car(5,"喵喵5",235F);Car car6 = new Car(6,"喵喵6",236F);list.add(car1);list.add(car2);list.add(car3);list.add(car4);list.add(car5);list.add(car6);return list;
}
(5)、测试获取集合多个对象json
开启postman,设置发出get请求,请求地址:http://localhost:8080/car/getAllCar
2.2 SpringBoot 请求传递参数
2.1.1 第一类:请求路径传参
@PathVariable
获取路径参数。即url/{id}
这种形式
@RequestParam
获取查询参数。即url?name=value
这种形式
(1)、修改Controller CarController新增接收参数,返回单个对象方法
@RequestMapping("/getCarById/{id}")
public Car geteCarById(@PathVariable("id") Integer id, @RequestParam("name") String name){Car car = new Car();car.setId(id);car.setName(name);car.setPrice(999.9f);return car;
}
(2)、测试传递参数获取单个对象json
2.1.2 第二类:@RequestBody 参数
(3)、修改Controller
CarController
新增接收封装对象参数,返回单个及多个对象方法
@RequestMapping("/getCar")
public Car getCar(Car car){return car;
}
(6)、测试传递普通body参数获取单个对象json
开启postman,设置发出post请求,请求地址:
http://localhost:8080/car/getCar
请求参数,选择body
2.3 SpringBoot 静态资源
2.3.1 默认静态资源映射
Spring Boot 对静态资源映射提供了默认配置
Spring Boot 默认将 /** 所有访问映射到以下目录:
classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
如:在resources
目录下新建public
、resources
、static
三个目录,并分别放入 a.jpg b.jpg c.jpg 图片
图片素材:👇👇
浏览器分别访问:
http://localhost:8080/a.jpg
http://localhost:8080/b.jpg
http://localhost:8080/c.jpg
均能正常访问相应的图片资源。那么说明,
Spring Boot
默认会挨个从public resources static
里面找是否存在相应的资源,如果有则直接返回。
2.3.2 自定义静态资源访问
试想这样一种情况:一个网站有文件上传文件的功能,如果被上传的文件放在上述的那些文件夹中会有怎样的后果?
网站数据与程序代码不能有效分离;当项目被打包成一个.jar文件部署时,再将上传的文件放到这个.jar文件中是有多么低的效率;网站数据的备份将会很痛苦。此时可能最佳的解决办法是将静态资源路径设置到磁盘的基本个目录。
第一种方式
- 1、配置类
package com.gansu.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/myPic/**").addResourceLocations("file:D:\\develop\\ideaIU-2018.2.5\\ideaIU-2018.2.5\\idea_workspace\\pic\\");}
}
上面的意思就是:将所有D:\develop\ideaIU-2018.2.5\ideaIU-2018.2.5\idea_workspace\pic\ 访问都映射到/myPic/** 路径下
2、重启项目
例如,在D:\develop\ideaIU-2018.2.5\ideaIU-2018.2.5\idea_workspace\pic\
中有一张a.jpg
图片
在浏览器输入:http://localhost:8080/myPic/a.jpg
即可访问。
第二种方式
首先,我们配置application.properties
web.upload-path=D:/develop/ideaIU-2018.2.5/ideaIU-2018.2.5/idea_workspace/pic/
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,\
classpath:/static/,classpath:/public/,file:${web.upload-path}
注意:
web.upload-path
:这个属于自定义的属性,指定了一个路径,注意要以/
结尾;
spring.mvc.static-path-pattern=/**
:表示所有的访问都经过静态资源路径;
spring.resources.static-locations
:在这里配置静态资源路径,前面说了这里的配置是覆盖默认配置,所以需要将默认的也加上否则static、public等这些路径将不能被当作静态资源路径,在这个最末尾的file:${web.upload-path}
之所有要加file:
是因为指定的是一个具体的硬盘路径,其他的使用classpath
指的是系统环境变量。
然后,重启项目
例如,在D:/develop/ideaIU-2018.2.5/ideaIU-2018.2.5/idea_workspace/pic/
中有一张a.jpg
图片
在浏览器输入:http://localhost:8080/a.jpg
即可访问。
三、SpringBoot 属性配置
Spring Boot并不真正是所谓的
『零配置』
,他的理念是“习惯优于配置”采用了一些默认的习惯性配置,让你无需手动进行配置,从而让你的项目快速运行起来。所以要想玩转Spring Boot,了解这些默认配置还是必不可少的。
3.1 项目默认属性配置文件所在位置及配置实例
创建Spring Boot项目时,会默认生成一个全局配置文件
application.properties
(可以修改后缀为.yml
),在src/main/resources目录下或者类路径的/config下。我们可以通过修改该配置文件来对一些默认配置的配置值进行修改。
【修改默认配置】
- 1、spring boot 开发web应用的时候,默认tomcat的启动端口为8080,如果需要修改默认的端口,则需要在application.yml添加以下记录:
server:port: 8081
重启项目,启动日志可以看到:Tomcat started on port(s): 8081 (http) 启动端口为8081 ,浏览器中访问 http://localhost:8081
能正常访问。
- 2、spring boot 开发web应用的时候,访问路径为
/
,如果需要修改访问路径,则需要在application.yml添加以下记录:
server:port: 8081servlet:context-path: /demo
重启项目,启动日志就可以看到:Tomcat started on port(s): 8081(http) with context path ‘/demo’,浏览器中访问 http://localhost:8081/demo/a.jpg
能正常访问。
3.2 实体类属性赋值
当属性参数变多的时候,我们习惯创建一个实体,用实体来统一接收赋值这些属性。
(1)、定义配置文件
server:port: 8081servlet:context-path: /demoUserBody:username: zhangsanpassword: 123age: 22birthday: 2024-7-27spring:jackson:date-format: yyyy-MM-ddtime-zone: GMT+8
(2)、创建实体类 UserBody
package com.gansu.pojo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable;
import java.util.Date;@Configuration
@ConfigurationProperties(prefix = "userbody") //prefix 参数必须全部为小写
public class UserBody implements Serializable {private String username;private String password;private Integer age;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;public UserBody() {}public UserBody(String username, String password, Integer age, Date birthday) {this.username = username;this.password = password;this.age = age;this.birthday = birthday;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "UserBody{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +", birthday='" + birthday + '\'' +'}';}
}
需要在实体类上增加注解
@ConfigurationProperties
,并指定prefix
前缀。prefix为全小写。
(3)、编写Controller调用属性bean
package com.gansu.controller;import com.gansu.pojo.UserBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@EnableConfigurationProperties({UserBody.class})
public class UserBodyController {@AutowiredUserBody userBody;@GetMapping("/getUser")public String getUser(){return userBody.toString();}
}
EnableConfigurationProperties
注解需要加在调用类上,或者加在启动类SpringbootSimpleApplication
上也可以。
访问地址:http://localhost:8081/demo/getUser
可以看到返回值:
3.3 自定义配置文件
application.yml
是系统默认的配置文件,当然我们也可以创建自定义配置文件,在路径src/main/resources下面创建文件test.properties
注意:spring boot1.5 版本后@PropertySource
注解就不能加载自定义的yml配置文件了
(1)、定义userBody.properties
删除或修改之前的yml,不然不生效
userbody.username=zhangsan88
userbody.password=12312388
userbody.age=228
userbody.birthday=2024-7-27
(2)、将配置赋值到 javabean
@PropertySource("classpath:userBody.properties")
@Configuration 注
解包含@Component
注解
1.5版本后需要通过@PropertySource(“classpath:userBody.properties”)
指定配置文件
(3)、Controller 读取配置和上面一致
访问地址:http://localhost:8080/getUser
可以看到返回值:
3.4 多环境配置文件
使用多个yml配置文件进行配置属性文件
可以使用多个yml来配置属性,将与环境无关的属性放置到application.yml
文件里面;通过与配置文件相同的命名规范,创建application-{profile}.yml
文件 存放不同环境特有的配置,例如application-test.yml
存放测试环境特有的配置属性,application-prod.yml
存放生产环境特有的配置属性。
通过这种形式来配置多个环境的属性文件,在
application.yml
文件里面spring.profiles.active=xxx
来指定加载不同环境的配置,如果不指定,则默认只使用application.yml
属性文件,不会加载其他的profiles
的配置。
(1)、创建application-dev.yml
server:port: 8082servlet:context-path: /demo2
(2)、创建application-test.yml
server:port: 8083servlet:context-path: /demo3
(3)、创建application-prod.yml
server:port: 8084servlet:context-path: /demo4
(4)、修改application.yml
spring:profiles:active: prod
通过设置,active: 的值对应不同的{profile}就可以使对应的配置文件生效。
文章源码