SpringBoot
一、SpringBoot概述
1、SpringBoot简介
Spring Boot 是用来简化 Spring 的搭建和开发过程的全新框架。Spring Boot 去除了大量的 xml 配置文件,简化了复杂的依赖管理,配合各种 starter 使用,基本上可以做到自动化配置。Spring 可以做的事情,现在用 Spring boot 都可以做。
2、优点:
- 快速创建独立运行的Spring项目以及与主流框架集成
- 使用嵌入式的Servlet容器,应用无需打成WAR包
- starters自动依赖与版本控制
- 大量的自动配置,简化开发,也可修改默认值
- 可以完全使⽤代码的⽅式进⾏开发,⽽不需要 XML配置;
- 运行时应用监控
- 与云计算的天然集成
3、开发演进
Spring(配置繁重)>>>SpringBoot(简化开发)>>>SpringCloud(分布式开发)
二、SpringBoot项目创建及解析
1、SpringBoot创建
- IDEA 创建(推荐)
- 在线(⽹站)创建
参考博客:SpringBoot项目的创建
2、第一个SpringBoot程序
(1)Maven依赖:pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(2)编写Controller:
@RestController
public class helloController {
@RequestMapping("/hello")
public String index(){
return "helloWorld";
}
}
(3)启动运行:
SpringBoot内嵌了Tomcat可以直接启动运行
(4)项目构成
- static: 保存所有的静态文件js,css,images
- templates: 保存所有的模板页面(SpringBoot使用嵌入式的Tomcat,默认不支持JSP页面),可以使用模板引擎(freemarker、thymeleaf)
- application.properties(application.yml):SpringBoot应用的配置文件,可以修改自动配置的默认值。
3、组件解析及自动配置原理
(1)父依赖
主要依赖一个父项目,管理项目的资源过滤及插件。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
点进去,发现还有一个父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.0.RELEASE</version>
</parent>
这里是真正 管理SpringBoot应用里面所有依赖版本的地方,是SpringBoot的版本控制中心。以后我们导入依赖时默认是不需要指定版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了。
(2)启动器starter:
Spring Boot为我们提供了绝大多数场景的启动器(Starter),只要引入了相应场景的starter,相关应用场景的绝大部分配置将会自动配置,从而简化开发。
springboot-boot-starter-xxx
:就是spring-boot的场景启动器
spring-boot-starter
:SpringBoot的核心启动器,包括auto-configuration support, logging 和 YAML
spring-boot-starter-web
:导入了web模块正常运行所依赖的组件; 包括RESTful, 应用Spring MVC. 使用 Tomcat 作为默认的嵌入容器。
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;也可以自己自定义 starter。
常用场景启动器:https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#using-boot-starter
(3)主启动类:
@SpringBootApplication
标注说明这个类是SpringBoot的主配置类 , 我们通过运行这个类的main方法来启动SpringBoot应用;
点击@SpringBootApplication后发现还有其他注解:
@SpringBootConfiguration
@EnableAutoConfiguration //核心注解
@ComponentScan
1)@ComponentScan
@ComponentScan对应XML配置中的元素。能自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中.
2)@SpringBootConfiguration
表示这是一个SpringBoot的配置类;我们继续进去这个注解查看:
@Configuration
@Configuration说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件;继续点击:
@Component
@Component 说明,启动类本身也是Spring中的一个组件而已,负责启动应用。
3)@EnableAutoConfiguration
@EnableAutoConfiguration
开启自动配置功能,是SpringBoot的 核心注解 。以前我们需要自己做一些配置,现在SpringBoot可以自动帮我们配置 ;点进注解接续查看:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
①@AutoConfigurationPackage
:自动配置包
-
继续点击发现:
@Import({Registrar.class})
@import 为Spring底层注解, 给容器中导入一个组件。 -
Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 。
②@Import({AutoConfigurationImportSelector.class})
:给容器导入自动配置类;
- AutoConfigurationImportSelector:自动配置导入选择器,那么它会导入哪些组件的选择器呢?我们点击去这个类看源码:
通过Debug设置断点,发现configurations中有很多自动配置类,这些配置类将会对我们需要场景的组件进行导入并配置。
这些配置类是从哪里加载过来的呢?
调用getCandidateConfigurations方法,获取候选的配置文件:
META-INF/spring.factories
:SpringBoot自动配置的核心文件
SpringBoot自动配置真正的实现是从classpath中搜寻所有的META-INF/spring.factories
配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些汇总为一个实例加载到IOC容器中。
- SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
- 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 ,并配置好这些组件 ;
- 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
主启动类主要做了以下四件事情:
- 推断应用的类型是普通的项目还是Web项目
- 查找并加载所有可用初始化器 , 设置到initializers属性中
- 找出所有的应用程序监听器,设置到listeners属性中
- 推断并设置main方法的定义类,找到运行的主类
(4)自动配置类解析
- xxxAutoConfiguration:自动配置类
- xxxProperties:属性配置类
- yml/properties文件中能配置的值都来源于属性配置类xxxProperties.
CTRL+N:搜索HttpEncodingAutoConfiguration,我们以这个配置类来举例说明:
- @Configuration:说明这是一个配置类
- @EnableConfigurationProperties(ServerProperties.class):启用ConfigurationProperties功能,将配置文件中的值和属性配置类ServerProperties绑定起来,并将属性配置类ServerProperties注入到IOC容器中。
点击ServerProperties.class:@ConfigurationProperties的作用就是从配置文件中获取指定的值和Bean属性进行绑定。所有能配置的属性都在xxxProperties属性配置类中封装着。
自动配置类:
- @ConditionalOnWebApplication:判断当前是否是Web应用。
- @ConditionalOnClass(CharacterEncodingFilter.class):当前项目中有没有CharacterEncodingFilter这个类。
- @ConditionalOnProperty:配置文件中是否包含某项配置
配置文件中配置debug=true
可以查看详细的自动配置报告:能够查看哪些配置类生效了,哪些配置类没有生效。
如果条件满足才将该组件注入到容器中:
- @ConditionalOnBean 容器中存在指定Bean;
- @ConditionalOnMissingBean 容器中不存在指定Bean;
- @ConditionalOnExpression 满足SpEL表达式
- @ConditionalOnClass 系统中有指定的类
- @ConditionalOnMissingClass 系统中没有指定的类
- @ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
- @ConditionalOnProperty 系统中指定的属性是否有指定的值
- @ConditionalOnResource 类路径下是否存在指定资源文件
- @ConditionalOnWebApplication 当前是web环境
- @ConditionalOnNotWebApplication 当前不是web环境
- @ConditionalOnJndi JNDI存在指定项
三、SpringBoot中的配置文件
- application.yml
- application.properties
参考博客:SpringBoot中的两种配置文件
四、SpringBoot中的日志
SpringBoot默认使用SLF4j+logback
实现日志记录输出。
参考博客:SpringBoot中的日志
五、SpringBoot——Web开发
静态资源、模板引擎、SpringMVC自动配置、RESTFUL、错误处理机制、嵌入式的Servlet容器。
参考博客:SpringBoot——Web开发
六、SpringBoot——数据访问
数据源的自动配置、SQL语句的初始化配置、JDBCTemplate、整合Druid数据源、整合Mybatis、SpringBoot JPA
参考博客:SpringBoot——数据访问
七、SpringBoot——启动配置原理
SpringBoot的启动流程,以及事件监听机制。
参考博客:SpringBoot——启动配置原理
八、SpringBoot——自定义starters
(1)创建空项目
(2)创建一个名为XXX-spring-boot-autoconfiguration的SpringBoot项目
- 创建配置类XXXproperties
- 创建服务
- 创建配置类,使用服务
(3)创建一个名为XXX-spring-boot-starter的Maven项目
- 引入XXX-spring-boot-autoconfiguration的依赖
(4)install :将我们的自定义启动器加入到本地仓库