SpringBoot学习笔记(一)
Idea中隐藏指定文件或指定类型文件
- setting->File Types->Ignored Files and Folders
- 输入要隐藏的文件名,支持*号通配符
- 回车确认添加
SpringBoot概述
parent
小结:
- 开发SpringBoot程序要继承spring-boot-starter-parent
- spring-boot-starter-parent中定义了若干个依赖管理
- 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
- 继承parent的形式也可以采用依赖的形式实现效果
starter
小结:
- 开发SpringBoot程序需要导入坐标时通常导入对应的starter
- 每个不同的starter根据功能不同,通常包含多个依赖坐标
- 使用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
小结:
- 内嵌Tomcat服务前是SpringBoot辅助功能之一
- 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
- 变更内嵌服务器思想是去除现有服务器,添加全新的服务器
REST风格
REST简介
-
REST,表现形态状态转换
传统风格资源描述形式
http://localhost/user/getById?id=1
http://localhost/user/saveUserREST风格描述形式
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入门案例
- 设定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";
}
- 设定请求参数(路径变量)
@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(默认):请求访问路径
复制模块
小结:
- 在工作空间中复制对应工程,并修改工程名称
- 删除与Idea相关配置文件,仅保留src目录与pom.xml
- 修改pom.xml文件中的artifactId与新工程/模块名相同
- 删除name标签(可选)
- 保留备份工程供后期使用
基础配置
属性配置
- 修改配置
修改服务器端口
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"
总结:
- 在配置文件中可以使用${属性名}方式引用属性值
- 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析
- 封装全部数据到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
步骤:
- 创建新模块,选择Spring初始化,并配置模块相关基础信息
- 选择当前模块需要使用的技术集(MyBatis、MySQL)
- 设置数据源参数
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程序传递启动属性