快速开发底层原理
SpringBoot核心理念
- 能够实现帮助开发者快速的整合第三方框架(Spring、Mybatis、hibernate)
原理:Maven依赖封装整合和自定义starter. - 完全去除XML配置,采用注解形式
原理:SpringBoot其实根据 Spring 体系原生的注解实现包装 - 不需要外部容器,内嵌入服务器(Tomcat) .
原理:Java语言创建tomcat服务器,让后将本地class文件交给tomcat加载。 案例:注解方式启动MVC将SpringMVC交给内部tomcat运行。,
内置tomcat原理
手动利用springmvc 实现不需要 tomcat 实现项目启动,仿 springboot项目,main方法启动项目。
starter基本思想
starter 其实就是springboot 对第三方常用框架组件的命名方式。
Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。
starter命名是有规范: 如果是SpringBoot官方自定义Starter命名为
- Spring-boot-starter-XX 官方.
- mybatis-Spring-boot-starter 非官方的
自定义starter
1、新建项目
2、引入 maven 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
</dependencies>
3、编写Java类
TokenAutoConfiguration
@Configuration
@EnableConfigurationProperties(TokenProperties.class)
public class TokenAutoConfiguration {
@Bean
public TokenService tokenService() {
return new TokenService();
}
}
TokenService
public class TokenService {
@Autowired
private TokenProperties tokenProperties;
public String getToken() {
System.out.println("模拟生成token");
return tokenProperties.getTokenRedisHost() + "," + tokenProperties.getTokenRedisPwd();
}
}
TokenProperties
@ConfigurationProperties(prefix = "kaico")
public class TokenProperties {
private String tokenRedisHost;
private String tokenRedisPwd;
public void setTokenRedisHost(String tokenRedisHost) {
this.tokenRedisHost = tokenRedisHost;
}
public void setTokenRedisPwd(String tokenRedisPwd) {
this.tokenRedisPwd = tokenRedisPwd;
}
public String getTokenRedisHost() {
return tokenRedisHost;
}
public String getTokenRedisPwd() {
return tokenRedisPwd;
}
}
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.kaico.config.TokenAutoConfiguration
spring.factories 该文件作用:SPI 是 Java 提供的一种服务加载方式
4、将该jar包打入maven仓库中 mvn clean install
5、其他springboot 项目引入该jar包,在application 配置文件中配置 TokenProperties 类指定的两个参数,调用 TokenService 的方法时可以获取到这个参数。
SpringBoot源码深度解析
启动类源码分析
Springboot启动流程: 1、创建new SpringApplication 2、调用run方法 SpringApplication 的构造方法 获取当前启动环境,servlet运行、非servlet运行、响应式运行 扫描每一个jar包,将需要加载的ApplicationContextInitializer类加入到initializers集合中去
在一个Springboot应用中,classpath上会包含很多jar包,有些jar包需要在 ConfigurableApplicationContext#refresh() 调用之前对应用上下文做一些初始化动作,因此它们会提供自己的ApplicationContextInitializer实现类,然后放在自己的META-INF/spring.factories 属性文件中,这样相应的ApplicationContextInitializer实现类就会被SpringApplication#initialize发现:
拿到启动类
WebApplicationType 的作用
webApplicationType
- NONE 不会嵌入我们的web服务器最终通过外部tomcat服务器
- SERVLET需要使用servlet服务器运行
- REACTIVE 使用响应式web启动
设置banner图
1、启动类设置,手动设置banner对象 2、在src/mainlresouces下新建banner.txt,在文件中加入打印的信息,springboot默认加载resource下的banner.txt文件的内容 读取resource 中的banner.txt 文件和配置的banner配置的图片路径或者默认resource 中banner命名的图片名称 SpringbootApplication类中
SpringBoot加载配置原理
核心注解:@SpringBootApplication @EnableAutoConfiguration注解作用【加载第三方配置的启动类】,注入jar包中配置类到IOC容器中,也就是读取Springboot-autoconfigure jar包中 spring.factories中配置的109个类注册到IOC容器中去,但也不是所有的类都会注册进去,需要看你有没有引入对应的springboot依赖。和springMVC相关的 bean也注入到IOC容器中去了。
内置Tomcat 源码分析
server 配置类 支持三种 web服务器:Tomcat、Jetty、Undertow 默认创建Tomcat 先创建tomcat,在启动SpringMVC容器。
SpringMVC 容器加载源码分析
springMVC配置文件 创建DispatcherServlet注入到IOC容器
Springboot启动总结
核心分为两个步骤:
- 创建 SpringApplication对象
- 调用SpringApplication run 实现启动同时返回当前的容器上下文
具体流程: 3. 创建 SpringApplication对象 Springboot 容器初始化操作
-
在SpringApplication的构造函数中获取当前应用启动类型 原理:判断当前classpath是否有加载我们的servlet类 返回servlet web启动方式 -
setInitializers 读取SpringBoot包下面的META-INF/spring.factories 获取到对应ApplicationContextInitializer 的实现类装配到集合(initializers)中 -
setListeners 读取SpringBoot包下面的META-INF/spring.factories 获取到对应ApplicationListener 的实现类装配到集合(listeners)中 -
mainApplicationClass 获取当前运行的主函数 -
调用SpringApplication run方法实现启动 -
StopWatch stopWatch = new StopWatch(); 记录我们SpringBoot项目启动时间 -
getRunListeners(args); 读取我们的ETA-INF/spring.factories SpringApplicationRunListeners 类型存入到集合中 -
listeners.starting(); 循环调用监听starting方法 -
ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments); listeners.environmentPrepared(environment); 利用 listeners 读取我们配置文件数据到SpringBoot容器中 -
Banner printedBanner = printBanner(environment); 打印我们SpringBoot Banner -
创建SpringBoot上下文AnnotationConfigServletWebServerApplicationContext对象,根据 webApplicationType 创建对应的环境 -
refreshContext(context); 刷新我们上下文 -
开始创建我们的tomcat容器 run方法中的 refreshContext(context); 再到 applicationContext.refresh();
- 开始加载我们的SpringMVC
获取spring-boot-configurations下面的META-INF/ spring.factorie所有的类注册到IOC容器中。 org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
配置类
-
afterRefresh 定义一个空的模版给其他子类实现重写 -
listeners.started(context); 使用广播和回调机制通知监听器已SpringBoot容器启动成功 -
listeners.running(context); 使用广播和回调机制通知监听器已SpringBoot容器启动成功running
listeners (监听器集合) 获取源码分析,作用:加载配置文件配置信息到springboot容器中。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/854613854927413fa101930546ec4589.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAa2FpY28yMDE4,size_20,color_FFFFFF,t_70,g_se,x_16
读取自定义配置文件到Springboot容器中
1、编写Java类,实现 SpringApplicationRunListener 接口,可以实现分布式配置中心读取配置信息 2、通过在项目中的 resource下的 META-INF/spring.factories 文件中配置这个Java类就可以将这个Java类注入到SpringBoot容器中。 springboot 默认读取配置文件,默认读取配置文件的路径为:
|