目录
什么是Spring Boot?
Spring Boot是由 Pivotal 团队提供的框架 . 其目的就是为了简化 Spring 程序开发的 .让 本质上是为了让 Spring 开发更方便 , 让程序猿考虑的事情更少 .
Spring Boot 的核心 : 1. 快速添加依赖 2. 内置 web 容器 3. 自动装配 (例如在Servlet 时, 将数据库连接写死, 而 Spring Boot 时, 则是写在配置文件中,由 Spring Boot 根据这些连接信息自动构建一个 datasource对象等等,它就是一种机制, 简单来讲就是 Spring Boot 帮助我们自动构建对象 , 构建好的对象直接就可以使用)
Spring Boot 的优点 :
1 . 快速的继承框架 , Spring Boot 提供了启动添加依赖的功能 .(在创建项目的时候就可以进行勾选依赖,不需要再去 Maven 中央仓库去导了)
2 . 内置了运行容器 , 无需配置 Tomcat , 直接就可以运行和部署程序.
3 . 快速部署项目 , 无需外部容器即可启动并运行项目 .(也就是不需要再将项目打包成 jar 去部署到服务器上.)
4 . 使用注解和配置的方式进行开发 . (不用再去使用Spring时代繁琐的 xml 方式)
5 . 支持更多的监控的指标 , 可以更好的了解项目的运行情况 .
创建 Spring Boot 项目
步骤 :
1 . 安装 Spring Boot Helper 插件
2 . 新建项目 --> 勾选 Spring Initializr --> 选择参数 ---> 选择依赖 --> 加载依赖
选择的依赖中 :
Spring Boot DevTools 是用来做热部署的 (热部署的目的是不需要每次取重启项目, 配置好热部署后它会自动重新启动项目)
Spring Web 是让这个项目具备 Http 能力
Spring Boot 项目的创建 (网页版)
通过https://start.spring.io/ , 这个地址 我们就可以创建Spring Boot 项目了
介绍一下 Spring Boot 项目下的 文件 :
创建好之后 , 启动入口就是带有 @SpringBootApplication 注解的类. 这个类是Spring Boot 项目自带的类 .
约定 :
在之前的Spring 项目中, 我们是在配置文件中去设置的扫描路径 , Spring 会将扫描路径下的所有带有5大注解的类将它们都注册到Spring IoC容器中, 但是在Spring Boot 中, 不需要再去设置扫描路径, 而是将启动类同级目录下类包括子级的类注册到 Ioc 容器中 。这是Spring Boot 中的规定 。约定大于配置。
运行 Spring Boot
创建一个测试类 :
@Controller // 控制器 @ResponseBody // 加上这个注解表示返回的是数据, 而非页面 public class TestController { @RequestMapping("/hi") // url 路由注册 public String hi(String name) { return "你好呀, " + name; } }
启动Spring Boot 项目 , 通过浏览器来访问这个 路由地址.
在 IDEA 的打印日志中 可以得到一些关键信息 :
Spring Boot 配置文件
Spring Boot 配置文件 主要分为两种 :
1. 系统配置文件 : 系统使用的配置文件 (例如 : 端口号的设置. 连接数据库的配置)
2. 用户自定义配置文件 .
配置文件的作用
整个项目中所有重要的数据都是在配置文件中配置的 。例如 :
1. 数据库的连接信息 (用户名 和 密码 的设置)。
2. 项目的启动端口 。(可以在配置文件中去配置项目的启动端口)
3. 第三方系统的调用密钥等信息。
4. 用于发现和定位问题的普通日志和异常日志等。
换个角度想 : 如果没有配置文件那么Spring Boot 项目就不能连接和操作数据库 , 也不能去保存可以用于排查问题的关键日志 。
配置文件的格式
Spring Boot 配置文件主要分为以下两种格式 :
1 . .properties
2 . .yml (yaml)
注意 : 当一个项目中存在两种格式的配置文件, 并且两个配置文件中设置了相同的配置项,但值不同时, 那么 properties 的优先级更高 , 因此通常情况下一个项目中只会存在一种格式的配置文件 .
properties
properties 是以键值的形式进行配置的. ( Key = value )
用户自定义配置文件
# 自定义配置
hisname=lisi
通过代码来获取这个自定义配置
使用 @Value 注解来获取配置文件中的内容,
格式 : @Value("${}")
@Controller // 控制器
@ResponseBody // 加上这个注解表示返回的是数据, 而非页面
public class TestController {
@Value("${hisname}") // 使用 @Value 注解来获取自定义配置属性
private String hisname;
@RequestMapping("/gethisname")
public String gethisname() {
return hisname;
}
}
页面访问结果 :
properties 的缺点
如果 用户自定义中出现了 中文, 那么获取时可能就会出现乱码现象.
# 自定义配置 hisname=张三
yml
yml 的写法
# 配置数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
username: root
password: 111111
同样我们可以使用 @Value 注解来获取自定义配置.
# 自定义配置项
hername: xiaohua
@Controller // 控制器
@ResponseBody // 加上这个注解表示返回的是数据, 而非页面
public class TestController {
@Value("${hername}")
private String hername;
@RequestMapping("/gethername")
public String getHername() {
return hername;
}
}
yml 中 单引号 没有引号 双引号
# 自定义配置项
string:
t1: "my name is \n zhangsan"
t2: 'my name is \n zhangsan'
t3: my name is \n zhangsan
@Controller // 控制器
@ResponseBody // 加上这个注解表示返回的是数据, 而非页面
public class TestController {
@Value("${string.t1}")
private String t1;
@Value("${string.t2}")
private String t2;
@Value("${string.t3}")
private String t3;
@RequestMapping("/test")
public String test() {
System.out.println("t1: " + t1);
System.out.println("t2: " + t2);
System.out.println("t3: " + t3);
return t1;
}
}
控制台上的打印结果 :
根据打印结果可以看出 : 加上双引号在控制台打印时 \n 会被当做是换行符. 但是在单引号没没有引号的情况下则认为它是一个普通字符 不会进行转义.
yml 配置 对象
使用 yml 可以进行配置对象 , 使用 @ConfigurationProperties (prefix = "") 来获取对象
注意事项 :
1 . yml 中配置的 key值 要与 java 代码中的对象属性名一致.
2 . java 中的对象必须提供 setter 和 getter 方法 (否则 yml 的值就不能成功赋值给java对象).
示例 :
# 自定义配置项
student:
id: 999
name: 张三
age: 21
# 也可以采用行内的写法: student: {id: 999, name: 张三, age: 21}
@Component
@ConfigurationProperties("student")
@Data // lombok中的注解 : 提供了getter 和 setter 以及 toString 方法
public class Student {
private int id;
private String name;
private int age;
}
@Controller // 控制器
@ResponseBody // 加上这个注解表示返回的是数据, 而非页面
public class TestController {
@Autowired
private Student student;
@RequestMapping("/getStudent")
public String getStudent() {
return student.toString();
}
}
访问结果 :
另外 yml 也可以配置 集合 :
# 自定义集合 mylist: nums: - 12 - 22 - 33 @Component @ConfigurationProperties("mylist") @Data public class Mylist { private List<Integer> nums; } @Controller // 控制器 @ResponseBody // 加上这个注解表示返回的是数据, 而非页面 public class TestController { @Autowired private Mylist mylist; @PostConstruct public void test() { System.out.println(mylist.toString()); } }
控制台的打印信息 :
properties 与 yml 的区别
相同点 : 都是 SpringBoot 项目的配置文件
不同点 : 二者诞生的时间不同 , properties 是默认的配置文件 诞生较早 ,存在一定的冗余数据. 而 yml 它是后来才出来的一种标记语言 , 可以很好的解决数据冗余的问题 .
语法上的区别 : properties 采用 key = value 的形式. yml 使用的是 key: value 的形式. (类似于 json 的格式) . yml 的通用性更好 (支持多种语言) . yml 支持更多的数据类型 . yml 对于中文的兼容性更好 ! 而 properties 对中文的兼容性更差 .
设置不同环境的配置文件
步骤 : 新建一个新的配置文件, 命名规则: application-"这里进行命名".yml
每次需要更改环境时, 只需要在application.yml 中进行调整
命令: spring: {profiles: {active: "这里填写要更改的环境名, 只需要写 - 之后的名字"}} .
日志
日志最主要的用途就是排除和定位问题 , 帮助程序猿去解决问题 .
另外日志还有以下实用的功能 :
1 . 记录用户登录日志 , 用来分析用户是正常登录还是恶意破解用户 .
2 . 记录系统的操作日志 , 方便数据恢复和定位操作人 .
3 . 记录程序的执行时间 , 方便为以后优化程序提供数据支持 .
使用日志
使用 LoggerFactory 类 获取日志对象.
注意在导包的时候 , 不要选错 :
![]()
@Controller
@ResponseBody
public class UserController {
// 1. 得到日志对象
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
// 使用日志对象来打印日志
@RequestMapping("/printLogger")
public String printLogger() {
// 写日志
logger.trace("这是 trace");
logger.debug("这是 debug");
logger.info("这是 info");
logger.warn("这是 warn");
logger.error("这是 error");
return "Ok";
}
}
控制面板只打印了3个日志内容的原因是 : 项目默认的打印级别是 info
解释如下 :
日志的级别
设置日志级别的作用 :
1 . 快速的筛选重要的日志
2 .不同环境实现不同日志的级别
级别 : (从低到高)
trace : 级别最低
debug : 一般在调试的时候打印关键信息
info : 普通的打印信息 (默认的日志级别)
warn : 警告 , 一些警告信息 , 但是不影响程序的正常使用
error : 错误信息 .
fatal : 致命的 , 因为代码异常导致程序退出执行的事件 .
程序在打印日志时 , 只会打印当前设置的日志级别以及更高级别的日志级别.
日志级别的设置
# 设置日记级别
logging:
level:
root: error
com:
example:
controller: trace
System.out.println 相比 日志 有两个缺点 :
1 . 打印的信息不全 (没有打印日志的时间, 没有打印日志的来源)
2 . 不能实现日志打印的隐藏和显示
3 . System.out.println 打印的日志不能被持久化
日志调用的过程
具体实现是由 logback 实现 , 不让开发者直接调用 logback 的原因就是为了解耦 , SLF4J 就像是一个中间人 , 它的作用是为了承上启下 . (例如, 如果让开发者直接去调用logback , 某一时间突然 logback 出现了漏洞 , 这时开发者就要去找其他日志实现的类, 但难点在于 其他日志实现的接口都是不一样的, 修改起来极其麻烦, 因此让 SLF4J 去对接这些接口 , 再由开发者去对接SLF4J , 更好的实现了解耦)
日志的持久化
将日记报告保存到 磁盘中 .
1. 设置日志的保存目录
# 设置日志的保存路径 logging: file: path: D:\\log
每次的日志都会追加到这个文件下 , 不会覆盖 , 这个文件的默认大小为 10 MB 时, 超过这个大小 , 则Spring Boot 会新建一个保存日志的文件 , 默认情况下目录下的日志文件个数为 7 个 .
2 . 设置日志的保存文件
# 设置日记级别 logging: file: name: springboot-logs.log
则会放到项目的根目录下 :
使用 lombok 输出日志
使用 @Slf4j 就可以代替 private static final Logger logger = LoggerFactory.getLogger()
在类上加上 @Slf4j 注解 后, 它默认就会提供一个 log 对象 , log 就会有 trace , debug....方法.
@Controller
@ResponseBody
@Slf4j
public class UserController {
// 1. 得到日志对象
// private static final Logger logger = LoggerFactory.getLogger(UserController.class);
// 使用日志对象来打印日志
@RequestMapping("/printLogger")
public String printLogger() {
// 写日志
log.trace("这是 trace");
log.debug("这是 debug");
log.info("这是 info");
log.warn("这是 warn");
log.error("这是 error");
return "Ok";
}
}
End......