Bootstrap

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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;