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 自定义事件类(构造参数));
是观察者模式的典型应用