文章目录
一、微服务阶段
javaSE:OOP,即:面向对象程序设计
mysql:持久化
html+CSS+JS+Jquery+框架:视图
javaWeb:独立开发的MVC三层(模型层Model、视图层View以及控制层Controller)架构的网站:原始
ssm框架:简化了开发流程,配置也开始较为复杂;
war:tomcat运行
spring再简化:SpringBoot-jar:内嵌tomcat; 微服务架构!
服务越来越多:springcloud
二、SpringBoot概述
2.1、SpringBoot简化了Spring的开发
SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心投入到逻辑业务的代码编写中。
2.2、Spring缺点
(1)配置繁琐:虽然Spring的组件代码是轻量级的,但是它的配置却是重量级的。配置插件以及注解都非常麻烦。
(2) 依赖繁琐:找坐标很麻烦。
2.3、SpringBoot功能
-
自动配置:SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个,该过程是SpringBoot自动完成的。
-
起步依赖:起步依赖本质上是一个Maven项目对象模型(Project Object Object,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
-
辅助功能:提供了一些大项目中常见的非功能性特性,如嵌入式服务器(如内嵌tomcat)、安全、指标、健康检测、外部配置等。
SpringBoot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。
三、SpringBoot快速入门
3.1、快速构建SpringBoot工程
四、SpringBoot起步依赖原理
4.1、起步依赖原理分析
<!-- 导入两个坐标-->
<!-- springboot工程需要继承的父工程 -->
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<!-- web开发的起步依赖 -->
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
五、SpringBoot配置
5.1、配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但是如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者是application.yml(application.yaml)进行配置。
- properties:
server.port=8080
server.address=127.0.0.1
- xml:
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
- yml:
server:
port: 8080
address: 127.0.0.1
小结
- SpringBoot提供了2种配置文件类型:properties和yml/yaml
- 默认配置文件名称:application
- 在同一级目录下优先级为:properties>yml>yaml
5.2、YAML
YAML是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同编程语言程序导入,如:C/C++、Ruly、Python、Java、Perl、C#、PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
YAML文件的扩展名可以使用**.yml或者.yaml**。
小结
yaml:简洁,以数据为核心
-
基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分割符
- 使用空格缩进表示层次关系,相同缩进表示同一级
-
数据格式
- 对象
#对象(map):键值对的集合 person: name: zhangsan #${name} #参数引用,引用上面的name age: 20 address: - beijing - shanghai #对象行内写法 person2: {name: zhangsan,age: 20}
- 数组:使用**“-”**表示数组每个元素
#数组:一组按次序排列的值 address: - beijing - shanghai #数组的行内写法 address2: {beijing,shanghai}
- 纯量
#纯量,即我们说的常量:单个的、不可再分的值 msg1: 'hello \n world' #不会识别转义字符,会原样输出 msg2: "hello \n world" #会识别转义字符
-
参数引用
- ${key}
#参数引用 name2: lisi person3: name3: ${name2} #引用上面的name2 age3: 21
获取数据
-
读取配置的内容
- @Value
- Environment
- @ConfigurationProperties
-
当自定义的类出现红条时,可以在pom.xml文件中加上以下依赖:
<!-- 处理器的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
5.3、profile—进行动态配置切换
在开发SpringBoot应用时,通常同一套程序会被安装到不同的环境,比如:开发、测试以及生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常的麻烦。所以profile的功能就是用来进行动态配置切换的。
- profiles是用来完成不同环境下,配置动态切换功能的。
-
profile的配置方式
- 多profile文件方式:提供多个配置文件,每个配置文件代表一种环境。
- application-dev.properties/yml:开发环境
- application-test.properties/yml:测试环境
- application-pro.properties/yml:生产环境
- yml多文档方式
- 在yml中使用 **—**分隔不同的配置
- 多profile文件方式:提供多个配置文件,每个配置文件代表一种环境。
-
profile激活方式
- 配置文件:在配置文件application.properties/yml中配置:
spring.properties.active=dev/test/pro
-
虚拟机参数:在VM options中指定:
-Dspring.properties.active=dev/test/pro
-
命令行参数:java-jar xxx.jar指定:
--spring.properties.active=dev/test/pro
5.4、项目内部配置文件加载顺序
-
内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:(优先级逐渐降低)
1.file:./config/ ** : 当前项目下的/config目录下**
2**.file:./** :当前项目的根目录
3.classpath:./config/ :classpath的**/config目录**
4.classpath:/ :classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会失效
config下的优先级高于resources根目录下的优先级
5.5、项目外部配置文件加载顺序
六、SpringBoot整合其他框架
6.1、SpringBoot整合Junit
SpringBoot整合Junit的实现步骤:
①搭建SpringBoot工程;
②引入start-test起步依赖
<!-- starter-test起步依赖,整合Junit时需要导入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
③编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootTestApplication.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testAdd() {
userService.add();
}
}
④添加测试相关注解
-
@RunWith(SpringRunner.class)
@RunWith就是一个运行器 @RunWith(Junit4.class)就是指用Junit4来运行 @RunWith(SpringJunit4ClassRunner.class),让测试运行于Spring测试环境,以便在测试开始时自动创建Spring的应用上下文 --@RunWith(Suite.class)的话就是一套测试集合
-
@SpringBootTest(classes = 启动类.class):用于标识当前的类为测试用例的类,只需指定一个引导类即可。
⑤编写测试方法
6.2、SpringBoot整合Redis
SpringBoot整合Redis的实现步骤:
①搭建SpringBoot工程
使用快速构建SpringBoot工程的方法进行构建,最后一步有一点点变化:
②引入redis起步依赖
<!-- Redis的起步依赖,整合redis时需要导入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
③配置redis相关属性
④注入RedisTemplate模板
⑤编写测试方法,测试
6.3、SpringBoot整合Mybatis
SpringBoot整合Mybatis的实现步骤:
①搭建springBoot工程
②引入mybatis起步依赖,添加mysql驱动
<!-- mybatis的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--mysql的起步依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
③编写DataSource和MyBatis的相关配置
DataSource的配置:
#dataSource
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver #mysql版本为8以下,8以上则为:com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///springboot?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
password: '010802' #注意:若密码为纯数字或者是带有特殊符号(如:&)的,则需要使用单引号或者是双引号括起来
username: root
MyBatis的相关配置:
#mybatis配置
mybatis:
configuration:
map-underscore-to-camel-case: true #下划线驼峰设置
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL语句
mapper-locations: classpath:mapper/*Mapper.xml #mapper映射文件路径,从resources开始
type-aliases-package: com.itheima.springbootmybatis.domain #配置别名(即:配置项目中实体类包路径)
# config-location: classpath:mybatis-config.xml #指定mybatis的核心配置文件(即:mybatis-config.xml)
④定义表和实体类
⑤编写dao和mapper文件/纯注解开发
⑥测试
七、SpringBoot自动配置
7.1、Condition
Condition是在Spring4.0增加的条件判断功能,通过这个功能可以实现选择性地创建Bean操作。
需求:
在spring的IOC容器中有一个User的Bean,现要求:
1.导入Jedis坐标后,加载该Bean,没导入,则不加载。
<!-- 导入jedis的坐标-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<!-- <version>4.0.1</version>-->
</dependency>
2.将类的判断定义为动态的。判断哪个字节码文件存在可以动态指定。
小结:
- 自定义条件:
- 定义条件类:自定义类实现Condition接口,重写matches方法,在matches方法中进行逻辑判断,返回boolean值。matches方法的两个参数:
- context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。
- metadata:元数据对象,用于获取注解属性。
- 判断条件:在初始化Bean时,使用**@Conditional(条件类.class)**注解
- 定义条件类:自定义类实现Condition接口,重写matches方法,在matches方法中进行逻辑判断,返回boolean值。matches方法的两个参数:
- SpringBoot提供的常用条件注解:
- ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
- ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
- ConditionalOnMisssingBean:判断环境中没有对应的Bean才初始化Bean
7.2、切换内置web服务器
-
SpringBoot的web环境中默认使用tomcat作为内置服务器。SpringBoot提供了4种内置服务器供我们选择:
tomcat、jetty、netty以及undertow
7.3、Enable注解原理
7.3.1、@Enable*注解
SpringBoot中提供了很多Enable开头的注解,这些注解都用于动态启动某些功能的。而其底层原理是使用**@Import注解导入一些配置类,实现Bean的动态加载**。
7.4、@Import详解
7.4.1、@Import
@Enable*底层依赖于@Import注解导入一些类,使用**@Import导入的类会被Spring加载到IOC容器**中。而@Import提供4种用法:
-
导入Bean
-
导入配置类
-
导入ImportSelector实现类。一般用于加载配置文件中的类
-
导入ImportBeanDefinitionRegistrar实现类
7.5、@EnableAutoConfiguration注解
- @EnableAutoConfiguration注解内使用**@Import**(AutoConfigurationImportSelector.class)来加载配置类。
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当SpringBoot应用启动时,会自动加载这些配置类,初始化Bean。
- 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean才会被初始化
7.6、自定义starter步骤分析
7.6.1、案例:需求
自定义redis-starter,要求当导入redis坐标时,SpringBoot自动创建Jedis的Bean.
7.6.2、案例:实现步骤
①创建redis-spring-boot-autoconfigure模块(在此模块中写配置类)
②创建redis-spring-boot-starter模块,依赖redis-spring-boot-autoconfigure的模块
③在redis-spring-boot-autoconfigure模块中初始化Jedis的Bean。并定义META-INF/spring.factories文件
④在测试模块中引入自定义的redis-starter依赖,测试获取Jedis的Bean,操作redis。
八、SpringBoot事件监听
8.1、SpringBoot监听机制
- Java监听机制
SpringBoot的监听机制,其实是对java提供的事件监听机制的封装。
Java中的事件监听机制定义了以下几个角色:
①事件:Event,继承java.util.EventObject类的对象
②事件源:Source,任意对象Object
③监听器:Listener,实现java.util.EventListener接口的对象
- SpringBoot监听机制
SpringBoot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。
一些监听器接口如下:
ApplicationContextInitializer、SpringApplicationRunListener、CommandLineRunner、ApplicationRunner
九、 SpringBoot监控
9.1、SpringBoot监控概述-----actuator基本使用
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、配置属性、日志信息等**。**
使用步骤:
- 导入依赖坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
9.2、SpringBoot Admin图形化界面的使用
- Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。
- Spring Boot Admin有两个角色,客户端(Client)和服务端(Server)。
- 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册
- Spring Boot Admin Server的UI界面将Spring Boot Admin Client的Actuator Endpoint上的一些监控信息。
使用步骤:
-
admin-server:
- 创建admin-server模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1wfWG09-1688477980165)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230212231557781.png)]
2.导入依赖坐标admin-starter-server
<!-- 导入依赖坐标admin-starter-server --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> </dependency>
3.在引导类上启用监控功能**@EnableAdminServer**
-
admin-client:
1. 创建admin-client模块
2.导入依赖坐标admin-starter-client
<!-- 导入admin-starter-client依赖坐标-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
3.配置相关信息:server地址等
在客户端(Client)的application.properties文件配置:
#.配置相关信息:server地址等
#执行admin.server地址
spring.boot.admin.client.instance.prefer-ip=true
spring.boot.admin.client.url=http://localhost:9000
#开启endpoint详细信息
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
在服务器端(Server)的application.properties文件配置:
server.port=9000
4.启动server和client服务,访问server
十、SpringBoot部署
-
SpringBoot项目开发完毕后,支持两种方式部署到服务器:
- jar包(官方推荐)------对应内部的tomcat
- war包------对应外部的tomcat