微服务阶段
javase:OOP
mysql:持久化
html+css+js+jquery+框架:视图,框架不熟练
javaweb:独立开发MVC三层架构的网站
ssm:框架,简化了我们的开发流程,配置也开始较为复杂
上面的项目打的是war包:tomcat中运行
下面的springboot项目打的是jar包:内嵌tomcat
spring再简化:SpringBoot;微服务架构!
服务越来越多:springcloud
SpringBoot
1. 什么是SpringBoot
SpringBoot是基于Spring的一个JavaWeb的开发框架,能迅速的开发web应用,几行代码开发一个http接口。
约定大于配置的核心思想
Spring Boot的主要优点:
- 为所有Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目配置 自动装配
- 内嵌式容器简化Web项目
- 没有冗余代码生成和XML配置的要求
2. 微服务架构
在此之前,我们接触过的架构有:MVC三层架构、MVVM
那么什么是微服务架构呢?
首先我们要知道原先all in one的架构方式,我们把所有的功能单元放在了一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后再负载均衡。
所谓的微服务架构,就是打破之前all in one的架构方式,把每个功能元素独立出来。把独立出来的功能元素进行动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素,所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制
3. 第一个SpringBoot程序
- jdk1.8
- maven 3.6.1
- springboot 最新版
- IDEA
官方:提供了一个快速生成的网站,IDEA集成了这个网站
3.1 创建方式
- 可以在官网直接下载后,导入idea开发
https://start.spring.io/
- 直接使用idea创建一个springboot
3.2 IDEA创建项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDZHmIoK-1602519646725)(G:\学习笔记\SpringBoot笔记\image\1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0OuWlYKv-1602519646729)(G:\学习笔记\SpringBoot笔记\image\2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybaBRG88-1602519646732)(G:\学习笔记\SpringBoot笔记\image\3.PNG)]
等待依赖导入成功后,删除不必要的文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNXxRROb-1602519646735)(G:\学习笔记\SpringBoot笔记\image\4.PNG)]
在构建完成springboot项目之后,我们看一下项目的目录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Grd1Nzid-1602519646737)(G:\学习笔记\SpringBoot笔记\image\5.PNG)]
3.3 编写代码
不需要我们原先的那些繁杂的配置文件
项目代码需要创建的包一定要和程序的主启动类在同一级目录下!!
直接在我们创建的controller
包下新建一个HelloController类,
代码的写法与在springmvc中所学的一样:
@RestController
public class HelloController {
// 接口:http://localhost:8080/hello
@RequestMapping("/hello")
public String helloSpringBoot() {
// 调用业务层,接收前端参数
return "Hello, SpringBoot!";
}
}
3.4 IDEA运行项目
springboot内部默认内嵌了tomcat去部署项目,
那么我们只需要运行==程序主启动类==中的main方法,
就是启动了该项目
package com.anuo.springboot_study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 程序的主入口,启动项目只需要运行此方法
* @SpringBootApplication:标注了这个类是一个springboot的应用
*/
@SpringBootApplication
public class SpringbootStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStudyApplication.class, args);
}
}
3.5 浏览器访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XdtYdKW5-1602519646741)(G:\学习笔记\SpringBoot笔记\image\6.PNG)]
3.6 命令行运行jar包
-
什么时候需要命令行运行?
- 当我们用IDEA怎么都启动不了项目,感觉代码也没什么问题时,可以试试脱离IDEA,使用命令行去运行项目的jar包。如果在命令行运行成功,就说明项目的代码是没有问题的,是IDEA的问题。
- 开发使用IDEA运行,部署测试使用命令行运行
-
步骤:
当我们执行Maven的
package
命令后。会将我们的项目打包成jar
包放置在target
文件夹下。打开cmd命令行,输入
java -jar 项目jar包名
,项目即可运行关闭运行中的项目:
Ctrl + C
小彩蛋
修改启动项目时,控制台所显示的头横幅:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TPOKNo2G-1602519646743)(G:\学习笔记\SpringBoot笔记\image\7.PNG)]
-
步骤:
-
网址
https://www.bootschool.net/ascii
去生成想要的ASCII文字,可以自定义也可以选择设计好的
-
在项目的src - main - java - resources包下建立新文件
banner.txt
-
将我们要使用的ASCII文字拷贝进
banner.txt
文件例如:
// _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕机 永无BUG //
-
-
展示效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmQGnSpx-1602519646746)(G:\学习笔记\SpringBoot笔记\image\8.PNG)]
4. 核心配置文件
SpringBoot使用一个全局的配置文件,配置文件名称是固定的。
- application.properties
- 语法结构: key=value
- application.yaml 【推荐】
- 语法结构:key: (空格) value
4.1 配置文件的作用
- 修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了
- 给组件(例如:实体类)注入属性值
4.2 YAML
YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml:
传统xml配置:
<server>
<port>8080<port>
</server>
yaml配置:
server:
prot: 8080
4.2.1 yaml基础语法
语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
yaml语法中的value,可以是字面量、对象、Map、数组等:
字面量:普通的值
例如:数字、布尔值、字符串
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号
key: value
- 如果字符串中有特殊字符,需要加双引号或者单引号,需要注意:
-
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思:
比如 :name: “kuang \n shen” 输出 :kuang
shen
-
‘’ 单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出
比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen
对象、Map(键值对)
#对象、Map格式
key:
value1:
value2:
在下一行来写对象的属性和值得关系,注意缩进。比如:
student:
name: chenjian
age: 3
行内写法:
student: {
name: chenjian, age: 3}
数组、List、Set
用 - 值表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
行内写法:
pets: [cat,dog,pig]
4.2.2 yaml中使用占位符
yaml配置文件还可以编写占位符生成随机数
person:
name: 陈健${
random.uuid} # 拼接随机uuid
age: ${
random.int} # 随机int值
happy: true
birth: 2019/11/02
maps: {
k1: v1, k2: v2}
lists: [code, music, girl]
dog:
# 当存在person.hello时,为person.hello的值;不存在时为"hello"
name: ${
person.hello:hello}_旺财
age: 3
4.2.3 组件注入配置文件
- yaml文件中使用注解**@ConfigurationProperties(prefix = “#”)** 【重点】
- properties文件中使用注解**@PropertySource(“classpath: #”)**【扩展】
yaml文件更强大的地方在于,他可以简便地给我们的实体类直接注入匹配值!
首先,创建两个实体类:
-
Dog
@Component public class Dog { private String name; private Integer age; private Person person; // ...省略构造、getter和setter方法 }
-
Person
@Component public class Person { private String name; private Integer age; private Boolean happy; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; // ...省略构造、getter和setter方法 }
-
在原先Spring中给组件的属性注入值的方法:
普通类型使用:@Value
对象类型使用:@Autowired
@Component public class Dog { @Value("诺诺") private String name; @Value("3") private Integer age; @Autowired private Person person; // ...省略构造、getter和setter方法 }
-
在SpringBoot中支持yaml配置文件给组件的属性注入值:
-
yaml配置文件:
application.yaml
# springboot的核心配置文件 # yaml对空格的要求十分严格! # yaml能够注入到我们的配置类中 person: name: 陈健 age: 22 happy: true birth: 2019/11/02 maps: { k1: v1, k2: v2} lists: [code, music, girl] dog: { name: 旺财, age: 3}
-
在实体类person中使用注解
@ConfigurationProperties
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
/* @ConfigurationProperties作用: 将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定 参数 prefix = “person” : 将配置文件中的person下面的所有属性与之一一对应 */ @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private Integer age; private Boolean happy; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; // ...省略构造、getter和setter方法 }
-
测试
// 单元测试 @SpringBootTest class SpringbootStudyApplicationTests { @Autowired private Person person; @Test void contextLoads() { System.out.println(person); } } ====================================== 运行结果: Person{ name='陈健', age=22, happy=true, birth=Sat Nov 02 00:00:00 CST 2019, maps={ k1=v1, k2=v2}, lists=[code, music, girl], dog=Dog{ name='旺财', age=3}}
我们可以看到,配置文件中的配置成功注入到了组件中!!
-
-
在使用
@ConfigurationProperties
注解时,IDEA 提示springboot配置注解处理器没有找到[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNxugFgS-1602519646748)(G:\学习笔记\SpringBoot笔记\image\9.PNG)]
解决方案:在pom.xml中导入下面的依赖
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
-
在SpringBoot中同样支持properties配置文件给组件的属性注入值【扩展】
-
properties配置文件:
这里不需要用核心配置文件的名字:
application.properties
可以指定任意的名字:
person.properties
name=陈健
-
在实体类person中使用注解
@PropertySource
步骤一:加载指定的配置文件
步骤二:在特定字段上通过**@Value(“SPEL表达式”)**取出配置文件的值
当然也可以**@Value(“自定义值)**
@Component // 1.加载指定的配置文件 @PropertySource("classpath:person.properties") public class Person { // 2.SPEL表达式取出配置文件的值 @Value("${name}"
-