spring boot全体流程图
2025-01-22 14:04:06 1 举报
Spring Boot的流程图描绘了从项目初始化到应用程序运行的整个生命周期。核心内容包括起步依赖管理、自动配置、内嵌服务器、应用上下文启动、Actuator监控端点等关键组件。在文件类型方面,Spring Boot通过Maven或Gradle构建配置文件(如pom.xml或build.gradle),实现了项目的依赖管理和构建生命周期。同时,通过application.properties或application.yml文件进行应用配置。 在整个流程中,修饰语涵盖了“自动”、“内嵌”、“灵活”和“无配置”等特性,体现了Spring Boot简化开发的宗旨。例如,“自动配置”使得开发者能够快速搭建项目,避免了繁琐的手动配置;“内嵌服务器”如Tomcat或Jetty,允许应用无须独立部署;“无配置”则突出了Spring Boot的约定优于配置的理念,让开发者可以仅仅通过代码命名规则和配置文件来管理整个应用的行为。这一切,都体现了Spring Boot致力于打造高效、简洁、可维护的现代Java应用开发框架的初心。
作者其他创作
大纲/内容
register(....)
配置环境信息对象configureEnvironment()
doInvokeListener(..)
reportFailure()
new SpringApplication(primarySources)创建 SpringApplication对象设置相关属性信息
c
getSpringFactoriesInstances()方法
springboot常用注解
1.用于向容器中导入自动配置组件,也就是给容器中导入场景需要的所有组件,并配置好这些组件;2.EnableAutoConfigurationImportSelector.class类是需要自动配置的选择器3.执行的方法:selectImports
ApplicationContextInitializer,设置初始化器,去spring.factories文件中
public interface Bootstrapper { //引导器接口 /** * Initialize the given {@link BootstrapRegistry} with any required */ void intitialize(BootstrapRegistry registry);}
Listeners.contextPrepared()发布刷新容器前的操作事件,上下文建立好的时候的时候发布, 那么监听contextPrepared事件的监听器就会触发
这个又有两个注解组合而成
选择
SpringFactoriesLoader.loadFactoryNames()方法
fireAutoConfigurationImportEvents广播时间
底层的@AutoConfigurationPackage注解 指定我们以后要扫描哪些包下的所有组件以后观察 Autoonfigurationackages的BeanDefinition怎么创建对象处理的,就知道我们自己写的controller何时进去等
value为字符串
springboot启动失败
postProcessApplicationContext()ioc容器的后置处理
判断webApplicationType类型
createApplicationContext()创建IOc容器
总结:● SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration● 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定● 生效的配置类就会给容器中装配很多组件● 只要容器中有这些组件,相当于这些功能就有了● 定制化配置 ○ 用户直接自己@Bean替换底层的组件 ○ 用户去看这个组件是获取的配置文件什么值就去修改。xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties
是否有异常
有
class SpringApplicationRunListeners { //运行时监听器类 void starting() {} void environmentPrepared() {} void contextPrepared() {} void contextLoaded() {} void started() {} void running() {} void failed() {} }
为bean工厂设置初始化信息
读取所有的配置源的配置属性值
指定扫描哪些,Spring注解,为spring容器中注入一个或者一个bean对象
底层的@Import(AutoConfigurationlmportSelector.class)注解导入组件SpringFactoriesLoaderloadFactoryNames0;去类路径下找 META-INF/spring.factories 文件SPI机制;找到@EnableAutoConfiguration全类名对应的所有配蛋的值
a
底层是一个@Configuration注解,告诉SpringBoot这是一个配置类 == 配置文件,自己本身也是一个bean
SpringApplication.run()
设置primarySources记录主方法的配置类名称
hash
deduceFromClasspath()方法
new DefaultBootstrapContext()创建默认引导上下文(Context环境)
new StandardServletEnvironment()
attach(environment)绑定环境信息
1.@Configuration
org.springframework.boot.SpringApplicationRunListener=\\org.springframework.boot.context.event.EventPublishingRunListener....等一共1个(这是spring-boot-包里面的META-INF/spring.factories文件里面写死了spring-boot一启动就要给容器中加载的所有事件发布器)
onApplicationEvent(..)在监听器中执行具体方法
loadSpringFactories(classLoaderToUse)
命令
public interface ApplicationListener { //监听器 /** * Handle an application event. * @param event the event to respond to */ void onApplicationEvent(E event);}
SpringFactoriesLoader.loadFactoryNames()利用该利用工厂加载得到所有的自动配置类
configureIgnoreBeanInfo()配置一下忽略的环境bean信息
500:h
5.@ImportResource(\"....xml\")
设置资源加载器
listener.started(context)发布器 EventPulishingRunListener发布ApplicationStartedEvent事件
context.getBeanFactory()获取Bean工厂
initialMulticaster.multicastEvent(...)
6.@EnableConfigurationProperties @ConfigurationProperties
。。。。
设置webApplicationType类型
不等于
WebApplicationType.REACTIVE响应式编程
4.@Conditional
获取容器中的 ApplicationRunner
1.利用Registrar给容器中导入一系列组件2.将主启动类所在包下的所有组件导入到容器中3.执行registerBeanDefinitions()方法
configureHeadlessProperty()让当前应用进入headless模式。java.awt.headless
org.springframework.boot.Bootstrapper=\\org.springframework.cloud.bootstrap.TextEncryptorConfigBootstrapper....等一共1个(这是spring-boot-包里面的META-INF/spring.factories文件里面写死了spring-boot一启动就要给容器中加载的所有初始化器)
stopWatch.stop()记录springboot容器的启动时长
prepareContext()准备ApplicationContext IOC容器的基本信息
new AnnotationConfigApplicationContext()
获取到所有之前的 bootstrappers 挨个执行 intitialize() 来完成对引导启动器上下文环境设置
invokeListener(..)
1.利用该利用工厂加载得到所有以type为key对应的相关组件2.从META-INF/spring.factories位置来加载一个文件 2.1:扫描当前想项目里面的META-INF/spring.factories文件 2.2扫描springboot包模块里面的META-INF/spring.factories文件
rethrowRuntimeException处理异常
@AutoConfigurationPackage
new StandardReactiveWebEnvironment()
listener.contextPrepared(context)发布器 EventPulishingRunListener发布ApplicationContextInitializedEvent事件
applyInitializers()应用初始化器
@FunctionalInterfacepublic interface CommandLineRunner { /** * Callback used to run the bean. * @param args incoming main method arguments * @throws Exception on error */ void run(String... args) throws Exception;}
bootstrappers,设置初始启动引导器,去spring.factories文件中
设置resourceLoader
用途都一样, 都是为spring容器中注入一个或者一个bean对象
listener.listeners.running(..)发布器 EventPulishingRunListener发布ApplicationReadyEvent正在运行事件
d
run(args)方法运行 SpringApplication
prepareEnvironment()准备环境信息
refresh()走spring的核心流程,创建容器中的所有组件
create(this.webApplicationType)
WebApplicationType.SERVLETServletWeb(当前)
refreshContext(context)刷新IOC容器
set
handleRunFailure()
classLoader.getResources(.....)
条件装配:满足Conditional指定的条件,则进行bean的注入
等于
springboot启动成功
fied
listener.contextLoaded(context)发布器 EventPulishingRunListener发布ApplicationPreparedEvent事件
Listeners.started()发布启动完成事件,刚执行完run方法的时候的发布,那么监听started事件的监听器就会触发
new StopWatch()stopWatch.start()创建一个任务执行观察器,并启动
把xml文件配置的bean注入到容器中
public interface ApplicationContextInitializer //初始化器 /** * Initialize the given application context. * @param applicationContext the application to configure */ void initialize(...)
Listeners.contextLoaded()上下文载入配置的时候发布,那么监听contextLoaded事件的监听器就会触发
1.@ConditionalOnRepositoryType 2.@ConditionalOnWarDeployment 3.@ ConditionalOnBean4.@ ConditionalOnSingleCandidate 5.@ ConditionalOnMissingBean 6.@ConditionalOnProperty 7.@ ConditionalOnMissingClass 8.@ ConditionalOnResource 9.@ ConditionalOnJava10.@ConditionalOnWebApplication 11.@ConditionalOnNotWebApplication12.@ ConditionalOnJndi 13.@ConditionalOnExpression 14.@ConditionalOnCloudPlatform 15.@ ConditionalOnEnabledResourceChain 16.@ ConditionalOnClass .....等
f
b
@Import(AutoConfigurationImportSelector.class)
removeDuplicates(configurations)//去重
new EventPublishingRunListener(....)创建EventPublishingRunListener实例对象进入构造方法
2.@Bean、@Component、@Controller、@Service、@Repository,@ComponentScan
没有
getRunListeners(args)1.获取 SpringApplicationRunListener 加载的是 EventPublishingRunListener 2.这是个 事件发布器 发布相关事件的 11个监听器 谁去发布事件
listeners.starting()触发启动事件 发布 starting 事件 --》 那么监听starting事件的监听器就会触发
@EnableAutoConfiguration
setEnvironment()设置IOC容器环境信息
SpringBoot写好的所有全场景的自动配置类全部导入进来,配置类就是给容器中放组件[@Bean] ,接下来就是spring的事情了
ApplicationListener,设置初应用监听器,去spring.factories文件中
spring boot原理总结SpringBoot整合了Spring和SpringMVC,boot底层都是spring\\springmvc
string
@ComponentScan
有三个注解组合而成
configurations.removeAll(exclusions)//剔除手动排除的
1.告诉SpringBoot这是一个配置类 == 配置文件,自己本身也是一个bean2.配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的3.属性:proxyBeanMethods:代理bean的方法 3.1Full(proxyBeanMethods = true):保证每个@Bean方法被调用多少次返回的组件都是单实例的,代理对象-cglib代理 3.2Lite(proxyBeanMethods = false):每个@Bean方法被调用多少次返回的组件都是新创建的,普通的 3.3 组件依赖必须使用Full模式默认。其他默认是否Lite模式
对象条件装配注解
printBanner(environment)打印springbootBanner信息
设置bean名称生成器
list
redisObjectvalue的底层
initialMulticaster创建多播器实例
new AnnotationConfigServletWebServerApplicationContext()
返回context
new AnnotationConfigReactiveWebServerApplicationContext()
createBootstrapContext()创建引导上下文(Context环境)
registerBeanDefinition
getOrCreateEnvironment()返回或者创建基础环境信息对象
两个注解组合一起可以实现配置属性绑定的功能
getSpringFactoriesInstancesRunListener(),读取spring.factories 文件中key 为 SpringApplicationRunListener的EventPublishingRunListener
200:d
@Import(AutoConfigurationPackages.Registrar.class)底层有这个注解构成
this.startTimeNanos = System.nanoTime()记录应用的启动时间
@FunctionalInterfacepublic interface ApplicationRunner { /** * @param args incoming application arguments * @throws Exception on error */ void run(ApplicationArguments args) throws Exception;}
SpringBoot核心注解@SpringBootApplication核心注解底层做了一下事情
ConversionService设置类型span style=\
遍历所有的runner。调用 run 方法
给容器中导入一个或者多个bean对象、默认组件的名字就是全类名
getAutoConfigurationEntry(annotationMetadata)该方法:给容器中批量导入一些组件
Zset
准备其他环境配置信息和绑定其他环境信息
value
new StandardEnvironment()
multicastEvent(.....)
listener.environmentPrepared(environment)发布器 EventPulishingRunListener发布ApplicationStartingEvent事件
listeners.running(context); 发布容器正在运行事件,那么监听running事件的监听器就会触发
initialMulticaster.addApplicationListener(.....)1.遍历获取11个监听器,并绑定初始的11个监听器2.其实就是我们前面加载的spring.factories文件中的11个监听器
registerBeanDefinitions
listener.starting()发布器 EventPulishingRunListener发布ApplicationStartingEvent事件
listeners是否为空
3.@Import
listener.listeners.failed(..)发布器 EventPulishingRunListener发布ApplicationFailedEventq启动失败事件
300:f
selectImports()
合并所有runner并且按照@Order进行排序
callRunners调用所有runners
spring boot自动装配原理
getConfigurationClassFilter().filter(configurations)过滤,检查候选配置类上的注解@ConditionalOnClass,如果要求的类不存在,则这个候选类会被过滤不被加载
1.从META-INF/spring.factories位置来加载一个文件 2.1:扫描当前想项目里面的META-INF/spring.factories文件 2.2扫描spring-boot-autoconfigure包里面的META-INF/spring.factories文件2.按需开启自动配置项 3.1虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration 3.2按照条件装配规则(@Conditional),最终会按需配置。
@SpringBootConfiguration
Spring启动容器,SpringMVC启动容器,embedTomcat启动
mainApplicationClass,设置main方法所在的Class对象名称
SpringBoot核心注解@SpringBootApplicatio解析
创建applicationArguments对象用于保存命令行参数
spring boot启动过程
listeners.environmentPrepared()发布环境配置好的事件,span style=\
keykey为字符串
0 条评论
下一页