背景:Spring Framework的缺点
多年以来,Spring Framework 饱受非议的一点就是大量的XML配置以及复杂的依赖管理。在2013年的SpringOne 2GX会议上,Pivotal的CTO Adrian Colyer回应了这些批评,并且特别提到该平台将来的目标之一就是实现免XML配置的开发体验。Boot 所实现的功能超出了这个任务的描述,开发人员不仅不再需要编写XML,而且在一些场景中甚至不需要编写繁琐的import语句。在对外公开的beta版本刚刚发布 之时,Boot描述了如何使用该框架在140个字符内实现可运行的web应用,从而获得了极大的关注度, 该样例发表在Twitter上。
为什么使用SpringBoot
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在 配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的 效率,一定程度上缩短了项目周期。
SpringBoot的特点
为基于Spring的开发提供更快的入门体验
开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置 等
SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
搭建SpringBoot项目
这里我们介绍最主流的搭建方式,也是企业中最常用的方式
第一步:
第二步:
点击next,到了第三步:去选择我们的依赖:
首先一进来可以选择上lombok依赖,以及Spring Boot DevTools(热部署)
然后点击Web,在Web里面选上SpringWeb
当然后序项目还可以添加很多依赖,这里就不再添加了,然后点击next生成项目即可.
SpringBoot项目结构
首先当我们使用了创建了springboot项目后,有些东西就可以直接不要了,例如上图中的.mvn, HELP.md, mvnw, mvnw.cmd这四个全部都可以删除掉,删除掉的目录结构如下所示:
每个结构的大致是什么我在下图中进行了标注:
基于SpringBoot项目的Web开发说明
嵌入式的Web服务器
SpringBoot 已经集成了 Tomcat,以后就不用像传统 Web 开发那样还需要下载一个 Tomcat 程序,配置启动了。只需要启动生成的启动类即可。
默认的Web资源文件夹
SpringBoot 默认会使用 src/main/resources 目录下的如下文件夹作为Web资源文件夹:
1./static:静态资源文件夹,如html,js,css等存放
2./public:静态资源文件夹,同上
3./templates:模版资源文件夹(后端模版框架使用的模版文件,会解析变量后再生成动态 html, 我们不学,了解即可)
注:在以上路径中的资源,服务路径不需要在前边再加 /static,/public。如在 static 文件夹下的
home.html ,服务路径为:/home.html
如果是使用普通Maven项目搭建,可以自行创建以上文件夹,在 src/main/resources 下创建public 和 static 文件夹即可。
默认的自动扫描
SpringBoot默认会扫描启动类所在包,只要位于该包以下的使用了Spring注解的类,都可以注册到容器 中,如以前学过的@Controller,@Service等。
示例:如启动类为 org.example.Application ,则可以扫描到org.example.controller.LoginController中的类注解@Controller。
默认的配置文件
SpringBoot默认使用src/main/resource/application.properties 作为启动的配置文件,可以自定义如启动端口等等配置。
如果是使用普通Maven项目搭建,在 src/main/resources 下创建 application.properties ,内容为空即可。
默认的应用上下文路径
SpringBoot启动的Web项目,应用上下文路径默认为 /
启动类
如果是使用普通Maven项目搭建,可以自行编写启动类:类上使用 @SpringBootApplication 注解:
package com.example.ordersys; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class OrdersysApplication { public static void main(String[] args) { SpringApplication.run(OrdersysApplication.class, args); } }
为了让应用启动后能自动编译,且启动不报错,最好设置启动类:
如果已经启动过,就修改配置:
需要修改的配置如下:此处也就是springboot的热部署
回顾web基础知识
1.http协议:请求方法,常用的头信息,请求体,常用响应状态码
2.url中:域名/ip,端口号,应用上下文路径,服务路径。分别对应什么,如果找不到会出现什么错 误?应该如何解决?
3.理解前端三剑客,html/css/js,为什么服务端资源文件,叫做客户端/前端代码。
4.理解 js 能做什么,可以不管是如何做
5.抓包工具的使用
springboot常用配置说明
详细配置可以参考官方文档 SpringBoot Appendices
以下介绍经常使用的配置:
还有一些配置会在Mybatis学习后使用。
debug
因为springboot内置了日志框架(logback),所以才能打印和保存日志
在application.properties配置文件内我们把其设置为true后,当我们启动启动类的时候,此时在输出框内会打印我们的日志.
debug = true
设置日志保存路径(两种方式)
方式1(建议使用这个,可以把日志程序分隔开)
此时我们的日志可以设置其保存路径,在application.properties配置文件内部去设置:如下图所示:
# 设置日志的存储路径 logging.file.path=logs/
设置完成后当我们重启我们的启动类后,我们会发现在目录上出现了logs目录,底下有spring自己自动命名的日志文件spring.log
但是此时出现了一个问题,假如这个项目运行一年了,那么这个日志一定记录了很久的东西,在想去打开它查看日志就比较困难了,此时就需要用到日志分割
设置每个日志文件的最大值(日志分割)
如果日志文件太大,就需要考虑到日志分割
# 设置每个日志的最大值,大小假设为10KB,注意必须写全KB,而且只能是大写 logging.logback.rollingpolicy.max-file-size=10KB
重新启动类,可以看到我们本地的日志文件此时就被分解为一个个小日志文件:
方式2
logging.file.name=myspring.log
可以看到运行之后在这里同样出现了日志文件:
把自己写的日志文件放入项目的日志文件
那么假设此时我们想把我们自己写的日志文件放入项目的日志文件该怎么办呢?
其实也非常的简单,下面我们来模拟这个过程:
首先还是自定义一个UserController类。这个类的路径为org.example.demo.controller.UserController,要注意一个问题,我们的controller包必须和我们的启动类在同一级别,如下所示:
下面来看代码:
package com.example.demo.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @RequestMapping("/user") @Controller public class UserController { //创建一个当前类的日志对象 private Logger logger = LoggerFactory.getLogger(com.example.demo.controller.UserController.class); @RequestMapping("/index") @ResponseBody public String getIndex(String name) { //logger里面记录日志的等级是非常多的,最高级别为error if (name == null || name.equals("")) { logger.error("我的日志信息:级别为:error"); } logger.debug("我的日志信息:级别为:debug"); logger.info("我的日志信息:级别为:info"); logger.trace("我的日志信息:级别为:trace"); logger.warn("我的日志信息:级别为:warn"); return "你好,springboot"; } }
注意此时我们选择的logger是如下包内的,即org.slf4j
自己写日志文件的步骤也非常的简单,第一步就是获取我们的日志对象,记得括号里面要写上具体类.class,第二步就是使用日志对象添加不同级别的日志信息了
同时我们还需要去我们的配置文件application.properties里面去配置我们的日志的打印级别:
配置打印级别分为两种方式
方式一:例如此时我们就想配置某个类里面的日志打印级别可以按照如下方式:
logging.level.com.example.demo.controller.UserController = debug
方式二:配置全局的打印级别,此时我们默认全局的日志的打印级别为debug
logging.level.root = debug
我们选择方式二进行测试:此时的配置文件内容如下:
debug = true # 设置日志的存储路径 logging.file.path=logs/ # 设置每个日志的最大值 logging.logback.rollingpolicy.max-file-size=10MB #配置全局的默认打印级别 logging.level.root = debug
然后此时先运行起来我们的项目,然后在浏览器地址中输入如下的请求进行访问:
http://localhost:8080/user/index
当在浏览器中看到如下的信息就代表此时请求传到了后端并且获取到了信息:
发送完毕后此时查看我们系统的日志可以便可以看到我们向日志文件中自己书写的日志了:
注意事项
第一点首先来看刚才所截的关于我们自己添加的日志文件图,我们默认设置的日志的全局的打印级别为debug,那么其打印结果出来的日志文件级别分别有error,debug,info,warn,而我们的trace竟然没有了,这是为什么呢?
原来我们的日志打印级别也是有优先级的:
trace
如果我们设置成为了debug,那么日志文件只打印大于等于debug这个优先级的日志文件,比它级别小的日志文件将不会被打印
第二点要注意的是有些同学可能会报错,原因是springboot内置的tomcat的问题,我们可以换下配置来看:
原有配置为:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
修改后的配置为:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除tomcat依赖 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 Undertow 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
第三点,我们可以看到我们每次都要创建对应类的日志对象就非常的麻烦,可不可以有一个非常简便的方法可以直接生成我们的日志对象,答案是有,仍然使用我们的lombok插件中的注解:@Slf4j,其默认的日志对象为log
此时我们修改我们的UserController类:
package com.example.demo.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @RequestMapping("/user") @Controller @Slf4j public class UserController { @RequestMapping("/index") @ResponseBody public String getIndex(String name) { //logger里面记录日志的等级是非常多的,最高级别为error if (name == null || name.equals("")) { log.error("我的日志信息:级别为:error"); } //此时默认的日志对象为log log.debug("我的日志信息:级别为:debug"); log.info("我的日志信息:级别为:info"); log.trace("我的日志信息:级别为:trace"); log.warn("我的日志信息:级别为:warn"); return "你好,springboot"; } }
最终的效果与之前是一样的,同学们可以自己运行体验.