> 文章列表 > SpringBoot学习笔记(一)

SpringBoot学习笔记(一)

SpringBoot学习笔记(一)

Idea中隐藏指定文件或指定类型文件

  • setting->File Types->Ignored Files and Folders
  • 输入要隐藏的文件名,支持*号通配符
  • 回车确认添加

SpringBoot概述

parent

小结:

  1. 开发SpringBoot程序要继承spring-boot-starter-parent
  2. spring-boot-starter-parent中定义了若干个依赖管理
  3. 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
  4. 继承parent的形式也可以采用依赖的形式实现效果

starter

小结:

  1. 开发SpringBoot程序需要导入坐标时通常导入对应的starter
  2. 每个不同的starter根据功能不同,通常包含多个依赖坐标
  3. 使用startwe可以实现快速配置的效果,达到简化配置的目的

引导类

  • 启动方式
@SpringBootApplication
public class SpringBootApplication {public static void main(String[] args) {SpringApplicaiton.run(SpringBootApplicaiton.class,args);}
}
  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean

小结:

  • SpringBoot工程提供引导类用来启动程序
  • SpringBoot工程启动后创建并初始化Spring容器

辅助功能

内置服务器

  • tomcat(默认)         apache出品,粉丝多,应用面广,负载了若干较重的组件
  • jetty         更轻量级,负载性能远不及tomcat
  • undertow          undertow,负载性能勉强跑赢tomcat

小结:

  1. 内嵌Tomcat服务前是SpringBoot辅助功能之一
  2. 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
  3. 变更内嵌服务器思想是去除现有服务器,添加全新的服务器

REST风格

REST简介

  • REST,表现形态状态转换
    传统风格资源描述形式
            http://localhost/user/getById?id=1
            http://localhost/user/saveUser

    REST风格描述形式
            http://localhost/user/1
            http://localhost/user

  • 优点:
    隐藏资源的访问行为,无法通过地址得到对资源是何种操作
    书写简化

  • 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
            http://localhost/users         查询全部用户信息 GET (查询)
            http://localhost/users /1        查询指定用户信息 GET (查询)
            http://localhost/users         添加用户信息 POST(新增/保存)
            http://localhost/users         修改用户信息 PUT(修改/更新)
            http://localhost/users /1        删除用户信息 DELETE (删除)

注意事项
上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts…

RESTful入门案例

  1. 设定http请求动作
@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody User user) {System.out.println("user sava..." + user);return "user save";	
}@RequestMapping(value = "/users", method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user) {System.out.println("user update..." + user);return "user update";	
}
  1. 设定请求参数(路径变量)
@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
@ResponseBody
public String update(@PathVariable Integer id) {System.out.println("user delete..." + id);return "user delete";	
}

详解

  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 范例:
@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody User user) {System.out.println("user save..." + user);return "user save";	
}

        value:访问请求路径
        method:http请求动作,标准动作(GET/POST/PUT/DELETE)

  • 名称:@PathVariable
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
  • 范例:
@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "user delete";	
}

@RequestBody         @RequestParam        @PathVariable

  • 区别
    @RequestParam用于接收url地址传参或表单传参
    @RequestBody用于接收json数据
    @pathVariable用于接收路径参数,使用{参数名称}描述路径参数

  • 应用
    开发中,发送请求参数超过1小时,以json格式为主,@RequestBody应用较广
    如果发送非json格式数据,选用@RequestParam接收请求参数
    采用RESTful进行开发,当参数数据较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

RESTful快速开发

  • 名称:@RestController
  • 类型:类注解
  • 位置:基于SpringMVC的RESTful开发控制器类定义上方
  • 作用:设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能
  • 范例:
@RestController
public class BookController {
}

  • 名称:@GetMapping       @PostMapping       @PutMapping        @DeleteMapping
  • 类型:方法注解
  • 位置:基于SpringMVC的RESTful开发控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求
  • 范例:
@GetMapping("/{id}")
public String getById(@PathVariable Interger id) {System.out.println("book getById,,,"+id);return "book getById";
}
  • 属性
    value(默认):请求访问路径

复制模块

小结:

  1. 在工作空间中复制对应工程,并修改工程名称
  2. 删除与Idea相关配置文件,仅保留src目录与pom.xml
  3. 修改pom.xml文件中的artifactId与新工程/模块名相同
  4. 删除name标签(可选)
  5. 保留备份工程供后期使用

基础配置

属性配置

  • 修改配置

修改服务器端口

server.port=80

关闭运行日志图标(banner)

spring.main.banner-mode=off

设置日志相关

logging.level.root=debug

SpringBoot默认配置文件application.properties

  • SpringBoot内置属性查询地址:
 http://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

配置文件分类

  • SpringBoot提供了多种属性配置方式

appliction.properties

server.port=80

appliction.yml

server:port:81

appliction.yaml

server:port:82

小结:

1、SpringBoot提供了3种配置文件的格式

  • properties(传统格式/默认格式)
  • yml(主流格式)
  • yaml

2、配置文件间的加载优先级

  • properties(最高)
  • yml
  • yaml(最低)

3、不同配置文件中相同配置按照假造优先级相互覆盖,不同配置文件中不同配置全部保留

4、指定SpringBoot配置文件

  • Setting -> Project Structure -> Facets
  • 选择对应项目/工程
  • Customize Spring Boot
  • 选择配置文件

yaml文件

yaml语法规则

字面值表示方式

boolean: TRUE         //TRUE,true,True,FALSE,false,False均可
float: 3.14            //6.8523015e+5  支持科学计数法
int: 123               //0b1010_0111_0100_1110 支持二进制、八进制、十六进制
null: ~                //使用~表示null
string: HelloWorld     //字符串可以直接书写
string2: "Hello World" //可以使用双引号包裹特殊字符
date: 2018-02-17       //日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00  //时间和日期之间使用T连接,最后使用+代表时区

数据表示方式:在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔

subject:- Java- 前端- 大数据
enterprise:name: itcastage: 16subject:- Java- 前端- 大数据likes: [王者荣耀,刺激战场]   #数组书写缩略格式
users:          #对象数组格式- name: Tomeage: 4- name: Jerryage: 5
users:          #对象数组格式二-name: Tomage: 4-name: Jerryage: 5
users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]

小结:
1.yaml语法规则

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾使用冒号结束
  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
  • #表示注释

2.注意属性名冒号后面与数据之间有一个空格

yaml数据读取

  • 使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名…}
lession: SpringBootserver:port: 82enterprise:name: itcastage: 16tel: 400618400subject:- Java- 前端- 大数据
@RestController
@RequestMapping("/boots")
public class BookController {@Value("${lesson}")private String lessonName;@Value("${server.port}")private int port;@Value("${enterprise.subject[1]}")private String[] subject_01;
}

总结:
1.使用@Value配合SpEL读取单个数据
2.如果数据存在多层级,依次书写层级名称即可

  • 在配置文件中可以使用属性名引用方式引用属性
baseDir: /usr/local/firecenter:dataDir: ${baseDie}/datatempDir: ${baseDir}/tmplogDir: ${baseDir}/logmsgDie: ${baseDir}/msgDir

属性值中如果出现转义字符,需要使用双引号包裹

lesson: "Spring\\tboot\\nlesson"

总结:

  1. 在配置文件中可以使用${属性名}方式引用属性值
  2. 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析

  • 封装全部数据到Enviroment对象
lession: SpringBootserver:port: 82enterprise:name: itcastage: 16tel: 400618400subject:- Java- 前端- 大数据
@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate Environment env;@GetMapping("/{id}")public String getById(@PathVariable Integer id) {System.out.println(env.getProperty("lesson"));			System.out.println(env.getProperty("enterprise.name"));System.out.println(env.getProperty("enterprise.subject[1]"));return "hello";	}
}

总结:
1.使用Enviroment对象封装全部配置信息
2.使用@Autowired自动装配数据到Enviroment对象中

  • 自定义对象封装指定数据
lession: SpringBootserver:port: 82enterprise:name: itcastage: 16tel: 400618400subject:- Java- 前端- 大数据
@Data
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {private String name;private Integer age;private String[] subject;
}
datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: root
@Data
@Component
@ConfigurationProperties(prefix = "datasource")
public class Enterprise {private String driverClassName;private String url;private String userName;private String password;
}

总结:
1.使用@CongigurationProperties注解绑定配置信息到封装类中
2.封装类需要定义为Spring管理的bean,否则无法进行属性注入

整合JUnit

  • SpringBoot整合JUnit
@SpringBootTest
class SpringbootApplicationTests {@Autowiredprivate BookService bookService;@Testpublic void testSave(){bookService.save();}
}
  • 名称:@SpringBootTest
  • 类型:测试类注解
  • 位置:测试类定义上方
  • 作用:设置JUnit加载的SpringBoot启动类
  • 范例:
@SpringBootTest
class SpringBootApplicaitonTests {}

总结:
1.导入测试对应的starter
2.测试类使用@SpringBootTest修饰
3.使用自动装配的形式添加要测试的对象

  • 名称:@SpringBootTest
  • 类型:测试类注解
  • 位置:测试类定义上方
  • 作用:设置Junit加载的SpringBoot启动类
  • 范例:
@SpringBootTest(classes = SpringbootApplication.class)
class SpringbootApplicationTest {}
  • 相关属性
    classes:设置SpringBoot启动类

注意事项:
如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定

总结:
1.测试类如果存在于引导类所在包或子包中无需指定引导类
2.测试类如果不存在引导类所在的包或子包中需要通过classes属性指定引导类

SpringBoot整合MyBatis

步骤:

  1. 创建新模块,选择Spring初始化,并配置模块相关基础信息
  2. 选择当前模块需要使用的技术集(MyBatis、MySQL)
  3. 设置数据源参数
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_dbusername: rootpassword: root

4.定义数据层接口与映射配置

@Mapper
public interface UserDao {@Select("select * from user")public List<User> getAll();
}

5.测试类中注入dao接口,测试功能

@SpringBootTest
class SpringbootMybatisApplicationTests {@Autowiredprivate BookDao bookDao;@Testpublic void testGetById(){Book book = bookDao.getById(1);System.out.println(book);}
}

总结:
1.勾选MyBatis技术,也就是导入MyBatis对应的starter
2.数据库连接相关信息转换成配置
3.数据库SQL映射需要添加@Mapper被容器识别到

SpringBoot整合MyBatis常见问题处理

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: root

总结:
1.MySQL8.X驱动强制要求设置时区

  • 修改url,添加serverTimezone设定
  • 修改MySQL数据库配置(略)
    2.驱动类过时,提醒更换为com.mysql.cj.jdbc.Driver

SpringBoot整合MyBatis-Plus

1.手动添加SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取

<dependency><groupId>com.baomidou</groudId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency>

注意事项:
由于SpringBoot中未收录MyBatis-Plus的坐标版本,需要指定对应的Version

2.定义数据层接口与映射配置,继承BaseMapper

@Mapper
public interface UserDao extends BaseMapper<User> {
}

总结:
1.手工添加Mybatis-Plus对应的starter
2.数据层接口使用BaseMapper简化开发
3.需要使用的第三方技术无法通过勾选确定时,需要手工添加坐标

整合Druid

导入Druid对用的starter

<dependency><groupId>com.alibaba</groudId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version>
</dependency>

变更Druid的配置方式

spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: root

总结:
1.整合Druid需要导入Druid对应的starter
2.根据Druid提供的配置方式进行配置
3.整合第三方技术通过方式

  • 导入对应的starter
  • 根据提供的配置格式,配置非默认值对应的配置项

工程打包与运行

1.对SpringBoot项目打包(执行Maven构建指令package)

mvn package

2.运行项目(执行启动指令)

java -jar springboot.jar

注意事项:
jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

总结:
1.SpringBoot工程可以基于java环境下独立运行jar文件启动服务
2.SpringBoot工程执行mvn名利package进行打包
3.执行jar命令:java -jar 工程名.jar

命令行启动常见问题及解决方案

window端口被占用


#查询端口
netstat -ano#查询指定端口
netstat -ano |findstr "端口号"#根据进程PID查询进程名称
tasklist |findstr "进程PID号"#根据PID杀死任务
taskkill -f -pid  "进程PID号"#根据进程名称杀手任务
taskkill -f -t -im "进程名称"

临时属性

1.使用jar命令启动SpringBoot工程时可以使用临时属性替换配置文件中的属性
2.临时属性添加方式:java -jar 工程名.jar –属性名=值
3.多个临时属性之间使用空格分隔
4.临时属性必须是当前boot工程支持的属性,否则设置无效

临时属性(开发环境)

带属性启动SpringBoot程序,为程序性添加运行属性
Edit Configrations->Configuration->Program arguments

--server.port=80 --logging.level.root=warn

通过编程形式带参数启动SpringBoot程序,为程序添加运行参数

public static void main(String[] args) {String[] arg = new String[1];arg[0] = "--server.port=8080";SpringApplication.run(SSMPApplication.class,arg);
}

不携带参数启动SpringBoot程序

public static void main(String[] args) {SpringApplication.run(SSMPApplication.class);
}

总结:
启动SpringBoot程序时,可以选择是否使用命令行属性为SpringBoot程序传递启动属性