基础篇在SSM的博客中
前置准备
① 导入图书管理项目(链接:https://pan.baidu.com/s/1izSGZW6eDiCPdhvO9ZZfzA 提取码:vc5e)
② 建表sql
CREATE DATABASE ssm_db;
USE ssm_db;
-- ----------------------------
-- Table structure for tbl_book
-- ----------------------------
DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`type` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`name` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`description` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = INNODB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of tbl_book
-- ----------------------------
INSERT INTO `tbl_book` VALUES (1, '计算机理论', 'Spring实战 第5版', 'Spring入门经典教程,深入理解Spring原理技术内幕');
INSERT INTO `tbl_book` VALUES (2, '计算机理论', 'Spring 5核心原理与30个类手写实战', '十年沉淀之作,手写Spring精华思想');
INSERT INTO `tbl_book` VALUES (3, '计算机理论', 'Spring 5 设计模式', '深入Spring源码剖析Spring源码中蕴含的10大设计模式');
INSERT INTO `tbl_book` VALUES (4, '计算机理论', 'Spring MVC+MyBatis开发从入门到项目实战', '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手');
INSERT INTO `tbl_book` VALUES (5, '计算机理论', '轻量级Java Web企业应用实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
INSERT INTO `tbl_book` VALUES (6, '计算机理论', 'Java核心技术 卷I 基础知识(原书第11版)', 'Core Java 第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新');
INSERT INTO `tbl_book` VALUES (7, '计算机理论', '深入理解Java虚拟机', '5个维度全面剖析JVM,大厂面试知识点全覆盖');
INSERT INTO `tbl_book` VALUES (8, '计算机理论', 'Java编程思想(第4版)', 'Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉');
INSERT INTO `tbl_book` VALUES (9, '计算机理论', '零基础学Java(全彩版)', '零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术');
INSERT INTO `tbl_book` VALUES (10, '市场营销', '直播就该这么做:主播高效沟通实战指南', '李子柒、李佳琦、薇娅成长为网红的秘密都在书中');
INSERT INTO `tbl_book` VALUES (11, '市场营销', '直播销讲实战一本通', '和秋叶一起学系列网络营销书籍');
INSERT INTO `tbl_book` VALUES (12, '市场营销', '直播带货:淘宝、天猫直播从新手到高手', '一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');
③ 修改配置文件中数据库的配置
④ 运行系统,访问:http://localhost/pages/books.html
查看各功能是否能够正常使用
1.工程打包与运行
1.1 windows
① 通过Maven ==> clean清楚数据
在通过Maven ==> package打包
打包文件所在位置如图所示
③ 通过指令运行jar包
D:\java_works\springboot_books\target>java -jar springboot_08_ssmp-0.0.1-SNAPSHOT.jar
④ 访问:http://localhost/pages/books.html
SpringBoot打包需要打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
jar包描述文件
MANIFEST.MF(Main-Class是jar启动器,Start-Class为主启动类)
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.example.SpringbootBooksApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.4
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher
命令行启动常见问题及解决方案
Windows端口被占用
#查询端口
netstat -ano
#查询指定端口
netstat -ano | findstr "端口号"
#根据进程PID查询进程名称
tasklist | findstr "进程PID号"
#根据PID杀死任务
taskkill /F /PID "进程PID号"
#根据进程名称杀死任务
taskkill -f -t -im "进程名称"
1.2 Linux
① 打包(同上节)
② 上传到linux(如上传到/usr/local/app包中)
注:linux需要安装java,mysql等
③ 使用指令运行jar包
$ java -jar /usr/local/app/springboot_08_ssmp-0.0.1-SNAPSHOT.jar
④ 本地访问:http://192.168.1.224/pages/books.html
⑤ linux后台启动jar包(保存日志到/usr/local/app/service.log中)
$ nohup java -jar /usr/local/app/springboot_08_ssmp-0.0.1-SNAPSHOT.jar > /usr/local/app/service.log 2>&1 &
⑥ 关闭后台运行的jar包
#搜索运行程序的pid
$ ps -ef |grep "java -jar"
root 3560 726 4 05:16 pts/0 00:00:07 java -jar /usr/local/app/springboot_08_ssmp-0.0.1-SNAPSHOT.jar
root 4735 726 0 05:19 pts/0 00:00:00 grep java -jar
#运行程序的pid为3560
#关闭进程
$ kill -9 3560
2.配置高级
运行时指定端口号(–属性名=值)
$ java -jar /usr/local/app/springboot_08_ssmp-0.0.1-SNAPSHOT.jar --server.port=8080
访问路径:http://192.168.1.224:8080/pages/books.html
携带多个属性启动SpringBoot时,属性使用空格分隔
测试临时参数
方式一
开启编辑
若没有找到输入参数的位置,则先勾选功能
添加需要测试的参数
方式二
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootBooksApplication {
public static void main(String[] args) {
//测试临时参数的方式二
// String[] arg = new String[1];
// arg[0] = "--server.port=8081";
// SpringApplication.run(SpringbootBooksApplication.class, arg);
//可以在启动boot程序断开读取外部临时配置对应的入口,也就是去掉外部参数的形参
SpringApplication.run(SpringbootBooksApplication.class);
}
}
2.1 配置文件4级分类
配置文件分类
- file :config/application.yml 【最高】
- file :application.yml
- classpath:config/application.yml
- classpath:application.yml 【最低】
作用
1级与2级留作系统打包以后这只通用属性,1级常用于运维经理进行线上整体项目部署方案调控
3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控
2.2 自定义配置文件
① 创建新的springboot项目,勾选Spring Web
② 创建BookController类
package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public String getById(){
System.out.println("springboot is running ...");
return "springboot is running ...";
}
}
③ 将application.properties改名为ebank.yml,并添加内容
server:
port: 80
④ 使得自定义配置文件生效
添加临时变量
--spring.config.name=ebank
或
--spring.config.location=classpath:/ebank.yml
多个配置文件则逗号分隔,如果配置相同属性后面的覆盖前面的
--spring.config.location=classpath:/ebank.yml,classpath:/ebank2.yml
自定义配置文件——重要说明
单服务器项目:使用自定义配置文件需求较低
多服务器项目:使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理
基于SpringCloud技术,所有的服务器将不在设置配置文件,而是通过配置中心进行设定,动态加载配置信息
3.多环境开发
YAML格式配置文件
#应用环境
#公共配置
spring:
profiles:
active: dev
---
#开发环境
spring:
profiles: dev
server:
port: 80
---
#生产环境
spring:
profiles: pro
server:
port: 81
---
#测试环境
#不过时的写法
spring:
config:
activate:
on-profile: test
server:
port: 82
也可以分别写三个配置文件application-dev.yml,application-pro.yml,application-test.yml
主配置文件application.yml(properties的配置文件也适用,书写格式需符合properties文件格式)
#选择使用哪个配置文件
spring:
profiles:
active: dev
多环境开发独立配置文件书写技巧
根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
application-devDB.yml
application-devRedis.yml
application-devMVC.yml
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境使用逗号分隔
spring:
profiles:
active: dev
include:devDB,devRedis,devMVC
注意事项:当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效
从SpringBoot2.4版本开始使用group属性替代include属性,降低了书写量
使用group属性定义多种主环境与子环境的包含关系
spring:
profiles:
active: dev
group:
"dev" : devDB,devRedis,devMVC
"pro" : proDB,proRedis,proMVC
"test" : testDB,testRedis,testMVC
3.1 多环境开发控制
Maven与SpringBoot多环境兼容
① Maven中设置多环境属性
<!--设置多环境-->
<profiles>
<profile>
<id>env_dev</id>
<properties>
<project.active>dev</project.active>
</properties>
</profile>
<profile>
<id>env_pro</id>
<properties>
<project.active>pro</project.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>env_test</id>
<properties>
<project.active>test</project.active>
</properties>
</profile>
</profiles>
② SpringBoot中引用Maven属性
spring:
profiles:
active: @project.active@
group:
"dev" : devDB,devRedis,devMVC
"pro" : proDB,proRedis,proMVC
"test" : testDB,testRedis,testMVC
③ 执行Maven打包指令,并生成boot打包文件.jar文件中查看对应信息
基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试工程时pom.xml每次更新需要手动compile方可生效
4.日志
4.1 日志基础
- 日志作用
- 编程调试代码
- 运营期记录信息
- 记录日常运营重要信息(峰值流量、平均响应时长……)
- 记录应用报错信息(错误堆栈)
- 记录运维过程数据(扩容、宕机、报警……)
代码中使用日志工具记录日志
① 添加日志记录操作
package com.example.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/books")
public class BookController {
//创建记录日志的对象
private static final Logger log = LoggerFactory.getLogger(BookController.class);
@GetMapping
public String getById(){
System.out.println("springboot is running ...");
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
return "springboot is running ...";
}
}
② 设置日志输出级别
# 开启debug模式,输出调试信息,常用于检查系统运行状况
#debug: true
# 设置日志级别,root表示根节点,即整体应用日志界别
logging:
level:
root: debug
可以通过日志组或代码包的形式进行日志显示级别的控制
logging:
level:
root: info
#设置某个包的日志级别
# com.example.controller: debug
#设置分组,对某个组设置日志级别
ebank: warn
#设置分组
group:
ebank: com.example.controller,com.example.service,com.example.dao
iservice: com.alibaba
日志级别
TRACE:运行堆栈信息,使用率低
DEBUG:程序员调试代码使用
INFO:记录运维过程数据
WARN:记录运维过程警告数据
ERROR:记录错误堆栈信息
FATAL:站南信息,合并计入ERROR
快速创建日志对象
手工方式
① 日志创建类
package com.example.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BaseClass {
public Class clazz;
public static Logger log ;
public BaseClass(){
clazz = this.getClass();
log = LoggerFactory.getLogger(clazz);
}
}
② 继承BaseClass类自动创建日志
package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
//创建记录日志的对象
// private static final Logger log = LoggerFactory.getLogger(BookController.class);
@GetMapping
public String getById(){
System.out.println("springboot is running ...");
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
return "springboot is running ...";
}
}
注解方式lombok
① 导入lombok依赖坐标
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
② 添加注解@Slf4j
package com.example.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
@GetMapping
public String getById(){
System.out.println("springboot is running ...");
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
return "springboot is running ...";
}
}
4.2 日志输出格式控制
2022-05-30 21:37:07.815 INFO 11380 --- [ main] com.example.Springboot02Application : Started Springboot02Application in 2.099 seconds (JVM running for 3.314)
日志格式依次为
时间 级别 PID 所属线程 所属类/接口名 日志信息
设置日志输出格式
logging:
#设置日志模板格式
pattern:
console: "%d %clr(%5p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
# console: "%d - %m %n"
%d:日期
%m:消息
%n:换行
4.3 日志文件
日志文件设置
logging:
file:
name: server.log
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log