SpringBoot

1.springboot入门、了解、创建helloworld

1.1回顾spring

为了解决企业级应用开发的复杂性而创建,简化开发,轻量级的java开源开发框架

1.2 spring如何简化java开发

基于POJO的轻量级和最小侵入性编程,所有东西都是bean

通过IOC、DI依赖注入和面向接口编程实现松耦合

基于切面和惯例进行声明式编程

通过切面和模板减少样式代码,RedisTemplate、JDBCTemplate等

1.3 springboot是什么

javaweb开发框架,和springmvc类似,优点在于简化开发,约定大于配置,可迅速开发web应用

基于spring开发,本身并不提供spring的核心特性及其扩展功能。只是用于快速、敏捷开发新一代基于spring框架的应用程序。核心思想在于约定大于配置。

3.1 springboot主要优点

开箱即用、内嵌式容器简化web开发、没有冗余代码和XML配置的要求

3.2 准备

jdk1.8,maven3.6.1,springboot2.X最新版,Intellij IDEA

1.4 通过idea创建springboot项目

默认生成的项目resource文件夹目录结构,包含static,templates文件夹及application.properties,分别保存静态资源,模板页面及springboot配置文件

pom文件中的spring-boot-starter表示springboot的场景启动器,导入了web模块正常运行依赖的组件

springboot将所有的功能场景抽取了出来,做成一个个的starter(启动器),只需要在pom文件中引入starter相关场景的所有依赖机会导入进来,需要什么功能,导入对应的启动器即可

自动生成的主程序类、主入口类,会有@SpringBootApplication注解

将应用打成jar包,可通过 java-jar 的命令执行

2.springboot配置文件,yaml语法,JSR303校验,多环境切换profile

2.1 使用全局配置文件,配置文件名称固定

application.preperties 语法结构key=value

application.yml 语法结构 key:空格 value

作用:修改springboot自动配置的默认值

2.2 yaml概述

YAML(Yet Another Markup Language):仍是标记语言

以数据为中心,并非以标记语言为中心

语法说明:必须严格满足语法(空格不可省略;缩进控制层级关系,左边对齐一列则都是同一层级;属性和值大小写十分敏感)

基本语法:key:空格value 表示一对键值对,空格不可省略;以空格缩进控制层级关系,左对齐的一列数据,都是同一层级

值的写法:

key: 数字/字符串/布尔 (字符串无需添加单引号或双引号)

对象 、Map(属性和值)(键值对)

数组(List,Set)

2.3 配置文件注入

yaml可以直接给实体类注入匹配值

resource目录下创建application.yml或者application.properties文件,在配置文件中按照对应的语法,采用配置方式和实体类进行匹配。

配置文件写好之后,在实体类上添加注解@ConfigurationProperties(prefix="bean的id")。注意,实体类必须才容器中,才可以使用@ConfigurationProperties的功能。

@ConfigurationProperties注解位于spring-boot-configuration-processor依赖中

注意:使用properties配置文件,会有乱码,需要在idea中的fileEncoding设置编码为UTF-8

加载全局配置文件外的指定配置文件,例如db.properties

在resource目录下新建的其他配置文件,采用@PropertySource("classpath:XXX.properties")来进行注入,并配合@Value使用(例如:@Value("${jdbc.driverClassName}") )

2.4 @ConfigurationProperties和@PropertySource、@Value的比较

@ConfigurationProperties只需要在类上写一次即可,@Value则需要针对每个属性进行编写

@ConfigurationProperties支持松散绑定。松散绑定比如说yml中设施last-name,可以和实体类中的属性lastName匹配

@ConfigurationProperties支持JSR303数据校验,添加一层验证,确保数据合法性

yml中可以封装复杂对象,value不支持

如何选择:@ConfigurationProperties和@PropertySource、@Value都可以的话,优先使用@ConfigurationProperties

只需要获取配置文件中某个值,可以使用@Value;

如果专门编写了一个javaBean和Yml进行一一映射,使用@ConfigurationProperties

配置文件注入值校验:类上添加@Validated修饰,属性上根据JSR303注解进行校验

@PropertySource作用:加载指定配置文件

@ImportReSource作用:导入spring配置文件(自己编写的配置文件,springboot不能自动识别),使配置文件生效;@ImportResource标注在配置类上

给容器添加组件,推荐使用全注解方式。@Configuration表示配置类,@Bean给容器中添加组件,springboot自动装配都是配置类

配置文件占位符:随机数 ${random.value/int/long/int(10)/int[1024,65536]};获取之前配置的值,如果没有则指定默认值 ${Person.name:HELLO}_小明 (如果Person的name,则使用HELLO)

2.5 JSR303校验

@Validated校验数据,数据异常会统一抛出异常,方便异常中心统一处理;数据校验可保证数据准确性

常见参数:@NotNull(message="XX不能为空"),@Null,@NotBlank,@NotEmpty,@AssertTrue,@AssertFalse,@Size,@Length,@Past,@Future,@Pattern等

2.6 多环境切换profile

profile是spring对不同环境提供不同配置功能的支持,可通过激活不同环境版本,实现不同的功能

多配置文件

application-{profile}.preperties 指定多个环境版本,但是springboot并不会直接启动这些配置文件,默认使用application.preperties主配置文件

通过spring.profiles.active={profile}来进行激活的环境

yml支持多文模块,将多个文件的内容写在同一个yml文件中

如果yml和properties同时配置,并没有激活其他配置,默认使用proerties配置文件

配置文件的加载位置顺序,高优先级会覆盖低优先级的配置,4个位置的主配置文件呈互补

优先级1:项目路径下的config文件夹配置文件

优先级2:项目路径下配置文件

优先级3:资源路径下的config文件夹配置文件

优先级4:资源路径下配置文件

可通过spring.config.location改变默认的配置文件位置

例如:java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

3.starter启动器、SpringBoot自动配置原理、@Conditional、run方法执行流程图

3.1 pom文件

父依赖

导入依赖默认无需填写版本号,但如果导入的包没有在依赖中管理则需要填写版本号

启动器 spring-boot-starter

spring-boot-starter-web导入web运行锁依赖的组件;springboot将所有场景抽象出来,做成一个个starter启动类,引入starter,即可将所有依赖导入

3.2 默认主启动类

本身即spring配置类,一个spring组件

@SpringBootApplication: 说明被标注类是springboot的主配置类,运行此类的main方法来启动springboot应用

@SpringBootApplication中,还有很多其他注解,分别为@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan

@ComponentScan:自动扫描并加载符合条件的组件或bean,将bean定义加载到IOC容器中

@SpringBootConfiguration:标注在类上,表示是springboot配置类

进入此注解,可看到@Configutation羞耻

@EnableAutoConfiguration:开启自动配置

进入此注解,使用@AutoConfigurationPackage 修饰,作用在于:自动配置包

进入@AutoConfigurationPackage,使用@Import({Registrar.class})修饰,作用在于给容器中导入组件,将Registrar导入容器

Registrar.class作用:将主启动类及其下面所有子包的所有组件扫描到Spring容器

@Import({AutoConfigurationImportSelector.class}):给容器导入 AutoConfigurationImportSelector 组件;

AutoConfigurationImportSelector作用:自动配置导入选择器。此类中存在selectImports方法,是将所有被需要的组件以全类名的方式返回,这些组件即可添加进容器中

有了自动配置类,即可避免手动编写配置注入组件等工作

spring.factories:包含很多自动配置文件,自动配置根源所在

自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories,并org.springframework.boot.autoconfigure.包下的配置项,通过反射实例化为标注@Configuration的IOC容器配置类,然后将这些汇总成为一个实例并加载到IOC容器中

总结

springboot启动时是从META-INF/spring.factories中获取EnableAutoConfiguration指定的值

将这些值作为自动配置类导入容器,自动配置类就会生效,帮助进行自动配置

整个J2EE的整体解决方案和自动配置都是springboot-autoconfigure的jar中

会给容器中导入非常多的自动配置类,即导入这个场景容器所需的所有组件,并配置好组件

有了自动配置了,可避免手动编写注入功能组件

@SpringBootApplication注解原理

主要通过两个@Import注解实现

@Import({AutoConfigurationPackage.Registrar.class}):将@SpringBootApplication修饰的主配置类,所在包及其包下所有自包里面所有组件导入至spring容器中

@Import({EnableAutoConfigurationImportSelector.class}):将springboot为J2EE企业级开发的默认配置,全部加载到spring容器

3.3 分析自动配置原理

自动配置原理

springboot启动会加载大量的自动配置类,自动配置类都是在META-INF/spring.factories中设置

给容器中自动配置类添加组件时,会从properties中获取属性,就可以在spring配置文件中使用这些属性,因为配置文件和属性已经通过@ConfigutationProperties绑定了

@Conditional注解及其派生注解作用说明

@Conditional:是spring-context下的注解,作用是按照条件进行判断,将符合条件的bean注入容器

派生注解:

@ConditionalOnJava:系统java版本是否符合要求,

可通过debug=true属性,使控制台打印自动配置报告

3.4 springboot自动配置流程

首先通过@EnableAutoConfiguration内的AutoConfigutationImportSelector选择器中的String[] selectImports方法,找到META-INF/spring.factories内的所有配置类并加载至容器中

其次将XXXProperties配置类和全局配置文件(.yml/.properties)通过@ConfigurationProperties进行绑定

最后通过@EnableConfigurationProperties({XXXProperties.class})将XXXProperties.class注册进容器中

3.5 SpringApplication

SpringApplication.run主要分为2部分,一是springapplication的实例化,二是run方法的运行

springapplication类主要做了4件事

推断应用是普通项目orweb项目

查找并加载所有可用初始化器,设置到initializers属性中

找出所有应用程序监听器, 设置到listeners中

推断并设置main方法的定义类,找到运行的主类

SpringApplication.run执行流程中最核心的步骤:将@EnableAutoConfiguration获取的所有配置及其他IOC容器配置加载到ApplicationContext中

4.日志框架介绍

4.1 springboot日志配置

日志框架

市面上日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j

日志门面:JCL、slf4j、Jboss-logging

日志实现:log4j2、JUL、logback

实现是选一个门面和一个实现。springboot用的是SLF4J和logback

SLF4J使用

使用org.slf4j.LogFactory对象,调用日志抽象层方法

每个日志框架实现都有自己的配置文件,使用slf4j后,配置文件还是做成日志实现框架自己本身的配置文件

遗留问题

项目中可能使用了不同的日志框架,可以统一适配SLF4J,中间使用SLF4J或第三方适配器适配到SLF4J。具体操作:先将其他日志框架移除、中间包替换原有的日志框架、导入SLF4J其他实现

4.2 springboot日志关系

spring-boot-starter-logging来做日志功能,springboot日志可以适配所有的日志,而且底层使用slf4j+logback来实现的,因此想引入其他框架,只需要将其他框架中的日志框架排除掉即可

日志使用

springboot默认配好了日志,Logger log = Logger.getLogger(getClass());

日志级别由低到高:tracx<debug<info<warn<error,默认info级别;级别越低,打印越多。

5.web开发、静态资源处理

5.1 web开发探究

idea中创建springboot项目,勾选需要的模块,springboot会自动配置好

向容器中配置组件:XxxAutoConfiguration;自动配置类,封装文件的内容:XxxProperties

5.2 静态资源处理

springboot是打包成jar的方式,不过也可以写界面,但是对界面文件存放路径有严格要求

在springboot中,springmvc的web配置都在WebMvcAutoconfiguration配置类中,addResourceHandlers(添加映射方法)

第一种:静态资源映射规则(webjars)

所有 /webjars/** ,都去classpath:/META-INF/resources/webjars/找资源;以jar的方式引入静态资源

例如引入jQuery静态资源,springboot就会去对应的路径(http://localhost:8080/webjars/jquery/3.4.1/jquery.js) 寻找对应的静态资源

第二种:自己的静态资源如何导入

ResourceProperties 设置了自定义静态资源在项目中可存放的位置

src/main/resources/META-INF/resources/、src/main/resources/resources/、 src/main/resources/static/、 src/main/resources/public/

首页映射:静态资源文件下所有的index.html页面,被/**映射

网站图标映射:在配置静态内容中查找 favicon.ico 文件,favicon.ico一般用作作为缩略的网站标志。

6.模板引擎介绍、thymeleaf 模板引擎

6.1 模板引擎

springboot是jar的形式,并非war,并且还是内嵌的tomcat,所以不支持jsp,但又不能采用纯静态界面,故此springboot推荐使用模板引擎

模板引擎很多中,例如jsp、freemarker、Velocity、Thymeleaf等,springboot推荐使用Thymeleaf.

模板引擎很多种,但是思想都一样,就是接收我们写的界面和数据,模板引擎将数据填充到对应的位置,生成一个最终的内容写出去。

6.2 Themeleaf导入

pom文件中引入spring-boot-starter-thymeleaf或直接导入

6.3 Thymeleaf分析

Themelead自动配置类:ThymeleafProperties,此类中规定了默认的前缀和后缀,前缀classpath:/templates/,后缀:.html。

因此只需要将html文件放在templates文件夹下,thymeleaf就可以自动渲染了

6.4 Themeleaf简单测试

编写controller,定义方法,通过Model的实例方法addAtribute给某个key赋值,返回字符串(可跳转到对应的heml界面),templates下对应的html文件输出controller中赋值的数据

6.5 Themeleaf语法

th:text --> 改变当前元素里面的文本内容;

th: 任意html属性 --> 来替换原生属性的值

7.SpringMVC自动配置原理 了解即可,深入了解查看CSDN

8.springboot错误处理机制&定制错误界面 了解即可,深入了解查看CSDN

9.自定义Servlet、Filter、Listener及替换web服务器方式 了解即可,深入了解查看CSDN

9.1 定制修改Servlet容器相关配置

配置文件中进行修改;使用WebServerFactoryCustomizer进行修改

9.2 注册Servlet三大组件 Servlet,Filter,Listener

Servlet:注入 ServletRegistrationBean

Filter:注入 FilterRegistrationBean

Listener:注入 ServletListenerRegistrationBean

10.自定义starter分析 了解即可,深入了解查看CSDN

11.整合数据访问、DRUID连接池

11.1 对JDBC整合

springboot默认是使用com.zaxxer.hikari.HikariDataSource作为数据源

数据源相关配置在 DataSourceProperties中

自动配置原理:jdbc相关配置参考DataSourceConfiguration,默认使用Hikari连接池

springboot创建连接池后,还会运行预定义的SQL脚本,参考 DataSourceInitializationConfiguration 配置类。配置文件中通过spring.datasource.schema来指定sql的位置,同时需要设置

initialization-mode: always

11.2 整合Druid数据源

添加druid-spring-boot-starter依赖;配置文件指定数据源类型和druid相关参数(包含相关监控配置);访问 ip:端口/druid/login.html即可针对druid数据库请求进行监控

12.整合MyBatis(注解、XML配置)

13.整合redis

引入 spring-boot-starter-data-redis依赖

通过spring.redis.host、spring.redis.port、spring.redis.database(表示那个库)配置连接

注入RedisTemplate和StringRedisTemplate进行操作

StringRedisTemplate是RedisTemplate的子类,两个类方法基本一致,区别在于操作的数据类型不同

RedisTemplate中两个泛型都是Object,StringRedisTemplate两个泛型都是String

RedisTemplate常用方法: opsForValue、opsForList、opsForSet、opsForZSet、opsForHash.注意:使用 RedisTemplate默认是将对象序列化到redis中,因此实体类需要实现序列化接口

StringRedisTemplate常用方法:hasKey、type、keys、getExpire、randomKey、move、opsForValue、opsForList、opsForSet、opsForZSet、opsForHash

14.整合任务(异步任务、定时任务、邮件任务)

异步任务

@EnableAysnc 添加在启动类上,表示开启异步注解功能

@Aysnc 修饰方法,表示从线程池中额外开辟一个线程执行此方法

定时任务

@EnableScheduling 启动类上添加,开启基于注解的定时任务功能

@Scheduled(corn = "") 方法上添加,定时执行

邮件任务

引入 spring-boot-starter-mail依赖

全局配置文件中通过 spring.main.username,spring.main.password,spring.email.hosts来配置邮箱地址及账号、授权码信息

注入JavaMailSenderImpl ,调用send方法,参数类型可以是MimeMessage 或SimpleMailMessage

15.整合spring security

自定义类继承WebSecurityConfigurerAdapter(类上添加@EnableWebSecurity,开启WebSecurity模式)

重写configure(HttpSecurity)方法和configure(AuthenticationManagerBuilder)方法,进行授权认证或密码校验

16.整合rabbitmq

rabbitmq需要提前安装

pom文件中引入rabbitmq依赖

springboot配置好的工作:RabbitAutoConfiguration 自动配置类,配置类中的连接工厂:ConnectionFactory;RabbitProperties封装了rabbitmq的配置

使用RabbitTemplate 发送和接收消息

17.ApplicationRunner接口作用

作用:常用于项目启动后,也就是Application.run方法运行结束后,立马执行某些逻辑,常用于加载配置文件、加载执行流、定时任务等。

使用:自定义类实现ApplicationRunner接口 重写run方法,如果有多个类实现了该接口,一般需要添加注解@Order(int 可以是负数)来从小到达的顺序依次执行

CommandLineRunner接口的功能和ApplicationRunner一样,区别在于run方法是String数组

18.ApplicationContextAware 和 BeanFactoryAware 使用理解

当某个类实现了ApplicationContextAware接口,spring容器在创建该bean之后,会自动调用该bean的setApplicationContext方法,将容器本身ApplicationContext作为参数传递给该方法

BeanFactoryAware是一个回调接口,提供了一个用于设置bean工厂的方法,当某个类实现了此接口,在该bean被实例化后,spring容器会调用setBeanFactory方法,将该bean所在的工厂对象作为参数赋值给该bean.主要用于获取bean时加载当前bean的工厂信息

19.spring中的ApplicationListener

自定义事件:自定义类继承ApplicationEvent

事件监听器

基于接口:实现ApplicationListener<自定义事件类>接口,重写onApplicationEvent方法,此类需要使用@Component向容器中注入

基于注解:自定义类,使用@Component修饰,自定义方法,使用@EventListerer(自定义事件类.class).此方式相对较好,不用多个事件有多个事件监听器

事件广播器

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(自定义配置类.class);

ac.publishEvent(new 自定义事件类(构造参数));

是观察者模式的典型应用

20.springboot实际操作

参考料:https://blog.csdn.net/cuiqwei/article/details/118188540

相关推荐
阿伟*rui7 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust