什么是SpringBoot?
我们现在的SSM框架对于现在主流的开发,架构起来还是太麻烦,简单来说SpringBoot可以让我们的spring生态架构变得更加简单。
springboot的优点与缺点
优点:
(1)之前我们的程序需要写一大堆的spring配置文件,用了springboot之后就简化多了
(2)之前我们的水果后台管理系统需要用tomcat进行web部署启动,使用springboot之后会内置 web启动器,非常方便
(3)之前我们的ssm框架需要一大堆的jar包,还要版本能够适配,现在只需要导入一个starter就 可以建立起一个web应用的场景,会帮我们自动配置好各种jar包
(4)现在我们使用mysql和redis省去了大量的配置步骤,要写数据库连接什么的
(5)运维人员可以实时监控程序的数据指标
(6)没有xml文件,可以进行完全注解开发
缺点:
现在编程架构的大背景
微服务
分布式
分布式可能出现的问题
如何解决这些问题
使用springboot快速搭建微服务模块,使用springcloud进行分布式部署
SpringBoot的HelloWorld
搭建环境
配置maven的环境,本地仓库,默认jdk,阿里云镜像
现在我们创建一个maven项目,但是如何让我们的程序使用springboot2呢?
在pom文件里加入标签,告诉idea,我们这次的项目需要使用springboot。
如何告诉idea我们现在开发的是一个web应用呢?——还是导入依赖
maven会自动导入web开发相应的环境与包,非常的方便。
书写代码
新建一个主程序类
主程序类:告诉项目这是一个springboot应用,只要写完了其他代码,执行主程序类,整个web项目就会自动跑起来,不用再像之前还要配置tomcat这种东西。
SpringApplication.run(主程序类的类名.class,参数args)——这个是主程序类的固定写法
直接书写springMVC的controller层
package com.LALALA.boot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
//@ResponseBody
//1.声明这是controller层,spring里的一个基础注解
//@Controller
//4.现在我们上面有两个注解,可不可以想办法整合一下?——可以
@RestController
public class HelloController {
//书写一个方法用来返回网页的/hello请求
//3.这个方法最后返回的是字符串,所以要加这个请求,但是这个类中可能不止这一个方法返回字符串,所以加在这个类上面比较好
//@ResponseBody
//2.这个请求是映射前端最后面加的是什么,如果加的是/hello,就执行这个方法
@RequestMapping("/hello")
public String handle01(){
return "Hello SpringBoot2 !";
}
}
运行程序
直接启动主类程序就可以啦,不用再配置tomcat什么的啦,方便好用
启动后控制台告诉我们tomcat已经在8080端口部署了
访问
成功访问
对配置的抽取
虽然现在程序可以运行,但是以前我们可以在tomcat里面改端口号或者其他配置,现在好像没法改。
但是,springboot对配置进行了抽取,我们只需要建立一个配置文件用来存放以后所以无论是tomcat,MVC.........所有的配置。
更改访问端口号为8888
测试成功
除了配置tomcat,还可以配置其他的东西
新的打包形式
之前我们的项目要打成war包放在tomcat上运行,但是现在可以直接打成jar包,在命令行窗口就可以启动,只需要在pom里添加标签
而且这个jar包里自带了所有的运行环境!
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
SpringBoot的特性
依赖管理
(1) 父项目做依赖管理
什么是父项目?
我们之前在pom文件里写的这个标签
我们的这个maven项目里已经用<parent>注明了我们继承了2.3.4版本的springboot项目,所以我们下面的其他所有依赖都不需要加版本编号了
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
这个父项目里面配置了许许多多的依赖,这样子项目只要继承了这个父项目,我们的项目以后就不用自己写其他的版本号什么的了。
譬如下面的我们引入spring的web启动器,就没有加版本号
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
但是我们导入的jar包的版本都是谁来控制的呢?
2.3.4版本的springboot项目的父项目是什么呢?
是这个,我们再查看它的父项目
我们发现它的properties标签里配置了许许多多的jar包版本
它几乎声明了所有开发中所依赖的常用jar包和适配的版本,这就是自动仲裁机制
所以我们在pom添加其他依赖的时候不用声明依赖的版本,不声明版本就是默认使用maven所设定的jar包
如果有一天不想用maven给我们默认的版本怎么办?
直接加version就可以了
(2)场景启动器starter
什么是场景启动器?
就是告诉项目现在我们是在做一个什么类型的项目,比如是web项目,maven就会引入所有相关的依赖
自动配置
自动配置一定需要两个东西,第一个引入依赖,第二个配置环境
(1)自动配置Tomcat
在我们引入web的启动场景的时候,tomcat依赖就已经引入了
(2)自动配置springMVC
众所周知,我们的springMVC一定需要中央控制器,我们写代码打印出所有的bean容器名称看看有没有中央控制器。
package com.LALALA.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//SpringApplication.run默认返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//查看容器中的所有组件
String[] names = run.getBeanDefinitionNames();
//打印容器中组件名称
for (String name : names){
System.out.println(name);
}
}
}
搜索控制台
有中央控制器组件
此外我们的MVC还有配置防止中文乱码的问题
测试看看不做任何多余配置能不能解决中文乱码
可以正常解决
(3)默认的包结构
之前我们的MVC要自己设定对哪些包进行扫描,现在不用自己配置,我们有默认的方式进行包扫描
以我们现在的结构,如果在LALALA包里建立一个controller就扫描不到了
测试
如果放在boot包(与主程序同包),就可以扫描到了
那么如果我们就是很叛逆的想像第一种那样放应该怎么办?
修改主程序类注解就可以
(4)各种配置的默认值
如果我们以后想要修改配置
可以在我们的application.properties文件修改
也可以后期提取到容器内的对象进行修改