目录
1.springboot简介
2.springboot的优势
3.创建springboot项目
4.输出hello world
5.热部署
6.properties配置文件
7.日志框架
在开始了解Spring Boot之前,我们需要先了解一下Spring,因为Spring Boot的诞生和Spring是息息相关的,Spring Boot是Spring发展到一定程度的一个产物,但并不是Spring的替代品,Spring Boot是为了让程序员更好的使用Spring。与我们前篇文章所提到的Spring-framework同属于spring的产品,大多数人把Spring Boot称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注于业务而非配置。
那到这里你是否会有这样的疑问,那spring呢?它和springboot有什么联系吗?
先了解一下Spring,Spring的前身是interface21,这个框架最初是为了解决EJB开发笨重臃肿的问题,为J2EE提供了另一种简单又实用的解决方案,并在2004年3月发布了Spring 1.0正式版之后,就引起了Java界广泛的关注和热评,从此Spring在Java界势如破竹迅速走红,至今无可替代。
那既然Spring已经这么优秀了,为什么还有了之后Spring Boot?
随着Spring发展的越来越火,Spring也慢慢从一个小而精的框架变成了,一个覆盖面广大而全的框架,另一方面随着新技术的发展,比如nodejs、golang、Ruby的兴起,让Spring逐渐看着笨重起来,大量繁琐的XML配置和第三方整合配置,让Spring使用者痛苦不已, 因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。
项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这也是件棘手的问题。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。
所以在这样的情况下,springboot就诞生了
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot其实就是一个整合很多可插拔的组件(框架),内嵌了使用工具(比如内嵌了Tomcat、Jetty等),方便开发人员快速搭建和开发的一个框架。
那么springboot有什么优势呢?总结出来以下五点:
1.快速集成框架,Spring Boot 提供了启动添加依赖的功能,用于秒级集成各种框架。
2.内置运行容器,无需配置 Tomcat 等 Web 容器,直接运行和部署程序。
3.快速部署项目,无需外部容器即可启动并运行项目。
4.可以完全抛弃繁琐的 XML,使用注解和配置的方式进行开发。
5.支持更多的监控的指标,可以更好的了解项目的运行情况。
了解了springboot之后,我们就开始来搭建springboot项目
Spring Boot项目创建,有两种方式:
方式二:使用IDEA Spring Initializr创建(推荐使用)
在这里需要注意:springboot的版本对jdk的版本是有要求的,如果springboot的版本选择3以上,那么上一个步骤jdk的版本就必须选择17,否则会报错
创建完成后具体文件解释如下:
方式一:访问网站创建项目:
1.访问网址:start.spring.io/
2.配置项目信息,点击Generate Project按钮生成项目,如下图:
其中,Group表示组织标识符,对应了Java包目录的结构;Arifact表示项目标识符,对应项目名称,也就是根目录名称。
3.解压文件夹,点击IDEA File => New => Project from Existing Sources... => 选择你解压项目文件夹目录 => 点击Ok => 选择Import project from external model => 选中Maven => 一路点击Next直到项目导入成功。
@SpringBootApplication为SpringBoot启动类注解
点击启动类的 main 方法就可以运行 Spring Boot 项目了
我们在包springbootstudy下创建包controller,在包下创建UserController
package com.example.springbootstudy.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import javax.annotation.PostConstruct; @Controller public class UserController { @PostConstruct public void init(){ System.out.println("UserController init hello world"); } }
根据上面的步骤,我们已经完成了Spring Boot项目的创建和运行,但是有一个问题就是,每次修改代码之后都需要重新启动调试,代码才能生效,比较麻烦,那有没有一种简单的方式呢?
答案是有的,那就是接下来要说的热部署。
热部署的配置如下:
这样修改对于我们修改web资源,可以立即生效,对于修改java代码,部分生效
整个项目中所有重要的数据都是在配置文件中配置的,比如:
1.数据库的连接信息(包含用户名和密码的设置);
2.项目的启动端口;
3.第三方系统的调用秘钥等信息;
4.用于发现和定位问题的普通日志和异常日志等。
想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排 查问题的关键日志,所以配置文件的作用是非常重要的。
Spring Boot 配置文件主要分为以下两种格式:
.properties 和.yml
如下图所示:
这就好像连锁店里面的统一服装一样,有两种不同的款式,properties 类型的配置文件就属于老款“服饰”, 也是创建 Spring Boot 项目时默认的文件格式(主要是由于仓库里还有库存),而 yml 属于新版款式,如果用 户了解情况直接指定要新款服饰,那么就直接发给他。
特殊说明:
1. 理论上讲 properties 可以和 yml 一起存在于一个项目当中,当 properties 和 yml 一起存在一个项目中 时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”,那么这个 时候会以 properties 中的配置为主,也就是** .properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息**。
2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文 件格式,这样可以更好的维护(降低故障率)。这就好像连锁店的服饰一样,不管是老款的服装还是新 款的服装,一定要统一了才好看。
博主在这里主要介绍第一中properties配置文件:
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。 @Value 注解使用“${}”的格式读取,如下代码所示:
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; import javax.annotation.PostConstruct; @Repository @Slf4j public class UserDao { @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @PostConstruct public void init(){ System.out.println(url); System.out.println(username); System.out.println(password); } }
日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的 原因吗? 答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说,最主要的用途就是排除和定位 问题。
除了发现和定位问题之外,我们还可以通过日志实现以下功能:
1.记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
2.记录系统的操作日志,方便数据恢复和定位操作人。
3. 记录程序的执行时间,方便为以后优化程序提供数据支持。
以上这些都是日志提供的非常实用的功能。
Spring Boot 项目在启动的时候默认就有日志输出,如下图所示:
以上内容就是 Spring Boot 输出的控制台日志信息。 通过上述日志信息我们能发现以下 3 个问题:
1.Spring Boot 内置了日志框架(不然也输出不了日志)。
2.默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢?
3.日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么怎么把日志永久的保存下来呢?
开发者自定义打印日志的实现步骤:
1.在程序中得到日志对象。
2.使用日志对象的相关语法输出要打印的内容。
接下来我们分别来看。
在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:
// 1.得到日志对象 private static Logger logger = LoggerFactory.getLogger(UserController.class);
注意:Logger 对象是属于 org.slf4j 包下的,不要导入错包。
因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志。
日志对象的打印方法有很多种,我们可以先使用 info() 方法来输出日志,如下代码所示:
// 2.使用日志打印日志 logger.info("--------------要输出日志的内容----------------");
打印日志效果展示:
日志的级别分为:
trace:微量,少许的意思,级别最低;
info:普通的打印信息;
debug:需要调试时候的关键信息打印;
warn:警告,不影响使用,但需要注意的问题;
error:错误信息,级别较高的错误日志信息;
fatal:致命的,因为代码异常导致程序退出执行的事件。
越往上接收到的消息就越少。
日志级别配置只需要在配置文件中设置“logging.level”配置项即可,如下所示:
配置跟路径的日志级别。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") public class UserController { // 1.得到日志对象 private static Logger logger = LoggerFactory.getLogger(UserController.class); @Value("${server.port}") private String port; @Value("${spring.datasource.url}") private String url; @RequestMapping("/sayhi") public String sayHi() { // 2.使用日志打印日志 logger.trace("================= trace ==============="); logger.debug("================= debug ==============="); logger.info("================= info ==============="); logger.warn("================= warn ==============="); logger.error("================= error ==============="); return "Hi," + url; } }
默认日志输出级别 清除掉配置文件中的日志设置,观察控制台输入的日志级别。
得到以下结论,日志的输出级别,默认是 info。
以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问 题,把日志保存下来的过程就叫做持久化。 想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后,Spring Boot 就会将控制台的日志写到相应的目录或文件下了。 配置日志文件的保存路径: