SpringBoot启动流程解析--2.2.5--持续完善
2021-07-19 17:06:21 26 举报
Springboot启动流程解析和一些衍生知识
作者其他创作
大纲/内容
BootstrapApplicationListener#onApplicationEvent
BeanDefinitatonParse#parse
Order保证了Listener的执行顺序,bootstrap的order值比configfile的order值小,所以会先执行
getRunListeners(args)获取SpringApplicationRunListener类型监听器EventPublishingRunListener
初始化前
加载所有依赖的初始化器SpringFactoriesLoader#loadFactoryNames(ApplicationContextInitializer.class)加载所有依赖包下META-INF/spring.factories取key=ApplicationContextInitializer的List<String>
getOrCreateEnvironment创建Servlet new StandardServletEnvironment()或其他环境
postProcessBeforeInstantiation
添加该注解的类所在depackage 作为 自动配置package 进行管理将包信息注册BeanDefinitionRegistry
SpringApplication(resourceLoader,primarySources)
初始化之前调用
以PrintStream打印Banner自有默认地址默认文件名默认打印的banner
contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);BeanUtils.instantiateClass(contextClass)根据环境类型实例化上下文context
listeners.running(context);发送运行中事件
进入配置文件解析监听器解析bootstrap的配置内容
postProcessAfterInstantiation
计时器停止打印主类启动完成日志
会话层
初始化
WebApplicationType.NONE缺少任意一个则是普通应用环境
影响ean创建的一大类接口
转换器用途:controller接口接口中String可以自动转Integer等,参数可以转换为对象实例等
Etcd
两个接口的run方法在于入参不一样,可自行选择可用于Springboot启动完后立即执行一些业务逻辑
在所有configuration/bean解析完后执行
丰富Bean功能的一大类接口
扫描指定包或当前注解所在包下的带有@Controller等注解的类作为bean
InterfaceImportSelector
@AutoConfigurationPackage
context.getBeanFactory().setConversionService()设置默认转换器DurationToStringConverterNumberToDurationConverterDurationToNumberConverter...
发送环境准备完成事件
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));加载所欲依赖的监听器
WebApplicationType.deduceFromClasspath()
ConfigFileApplicationListener#onApplicationEnvironmentPreparedEvent读取配置文件
Kube
1.读取环境的前置处理器并执行postProcessEnvironment方法,包含它自己也是processor解析系统配置,spring.application.json,VCAP环境,HostInfo的信息
method(String[])#selectImports
实例化后
主内存
结束
多线程单例模式标准写法实例
worker
动态代理
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等传输层:TCP,UDP网络层:IP,ICMP,OSPF,EIGRP,IGMP数据链路层:SLIP,CSLIP,PPP,MTU
scan
传输层
@SpringBootApplication
applyInitializers(context);将SpringApplication实例化设置的Initializers启动包括像包检查,ServerPort等
destory
starting()事件
registry
@SpringBootConfiguration
refresh() // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. // 所有BeanPostProcesser初始化的调用点 registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. // 所有单例非懒加载Bean的调用点 finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh();
表示层
Scheduler
if (this.lazyInitialization)context.addBeanFactoryPostProcessor 判断是否要添加懒加载的后置处理器
refreshContext(context);调用Spring的核心refresh()方法;详见Spring解析
实例化化阶段InstantiationAwareBeanPostProcessor
计时器启动
new SpringApplication(primarySources).run(args)
method#getCandidateConfigurations
Controller-manager
Server
listeners.started(context);发送启动完成事件
WebApplicationType.REACTIVE响应式WEB应用环境
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class))
初始化后
推断环境
Kubelet
实例化前
spring内置的标识为配置类的注解
线程共享变量区域
if (this.resourceLoader != null)判断是否自定义了资源加载器,有则设置
spring类内部注解:SpringIoC容器通过Bean后置注解处理器解析Bean内部的注解注解:是一种声明,通过扫描得到信息利用反射实现自定义注解:使用AOP实现->动态代理->反射
Voliate可见性内存屏障,防止重排序
listeners.contextLoaded(context);资源加载完成事件
BeanDefinitationDefaultListableBeanFactory#beanDefinitionMap
线程本地内存(抽象概念)#共享变量副本#本地方法栈
CGLib
选项参数--argName=val
各种各样的条件判断注解,满足条件时就加载这个Bean并实例化此类的条件注解是:@ConditionalOnProperty@ConditionalOnBean:当容器里有指定Bean的条件下@ConditionalOnClass:当类路径下有指定的类的条件下@ConditionalOnExpression:基于SpEL表达式为true的时候作为判断条件才去实例化@ConditionalOnJava:基于JVM版本作为判断条件@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置@ConditionalOnMissingBean:当容器里没有指定Bean的情况下@ConditionalOnMissingClass:当容器里没有指定类的情况下@ConditionalOnWebApplication:当前项目时Web项目的条件下@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下@ConditionalOnProperty:指定的属性是否有指定的值@ConditionalOnResource:类路径是否有指定的值@ConditionalOnOnSingleCandidate:当指定Bean在容器中只有一个,或者有多个但是指定首选的Bean
while
postProcessApplicationContext(context)
configureHeadlessProperty 设置java.awt.headless
ACK=1 ack=y+1 seq=x+1
Spring装配bean
代理模式
@ImportAutoConfigurationImportSelector
堆内存
使用ClassUtils.isPresent(className)方法判断依赖是否存在并且可以加载
实例化createInstance
SYN=1 seq=x
ConfigurationClassParser#processImports
实例化SpringApplication
if (this.beanNameGenerator != null)判断是否自定义了BeanName生成器,有则注册到容器
应用层
this.initialMulticaster = new SimpleApplicationEventMulticaster(); for (ApplicationListener<?> listener : application.getListeners()) { this.initialMulticaster.addApplicationListener(listener);}将所有监听器添加到SimpleApplicationEventMulticaster实例
1.将普通类定义为bean; 2.引入ImportSelector的实现类,把ImportSelector接口selectImports()方法返回的Class名称都定义为bean
向容器设置一些Bean和参数:springApplicationArguments,springBootBanner,allowBeanDefinitionOverriding
容器关闭
网络层
指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式
新建了一个运行时异常对象,通过这个对象获取当前的调用函数堆栈数组StackTrace,之后遍历这个堆栈数组,找到方法名为main的类,返回这个类
InvocationHandler、Proxy代理对象必须是实现接口
@Configuration
createApplicationContext()
1.bootstrapEnvironment = new StandardEnvironment();2.new SpringApplicationBuilder()#environment(bootstrapEnvironment)#application();新建SpringApplication.NONE的环境,构建了一个SpringApplication实例;3.@Import(BootstrapImportSelector.class);4.调用run方法;此时的environment#propertySources多了bootstrap;再次进入BootstrapApplicationListener监听器直接跳过;5.run完成后bootstrapProperties.remove(BOOTSTRAP_PROPERTY_SOURCE_NAME);移除bootstrap,复制context为bootstrap解析完后的上下文;
SYN=1 ACK=1 ack=x+1 seq=y
springbean**.xml
ISO七层模型
WebApplicationType.SERVLETWeb环境,Servlet
CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。
JDK
ISO模型,TCP/IP模型,TCP/IP协议
JMM Java内存模型
maaster
META-INF/spring.factories
listeners.contextPrepared(context)发送准备完成事件
SpringFactoriesLoader
new DefaultApplicationArguments创建传入的环境参数
初始化化阶段BeanPostProcessor
java.awt.headless是J2SE的一种模式用于在缺少显示屏、键盘或者鼠标时的系统配置,很多监控工具如jconsole 需要将该值设置为true
Client
deduceMainApplicationClass推断出当前启动的main函数所在的类
InitializingBean 初始化时,可以指定初始化方法DisposableBean 销毁bean时
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values()); runners.addAll(context.getBeansOfType(CommandLineRunner.class).values())span style=\"font-size: inherit;\
KeepliveHaproxy
填充属性populateBean@Autowired可能产生循环依赖
configureEnvironment>配置环境的默认属性或命令行传入参数>可以通过SpringApplication实例setDefaultProperties方法设置默认属性>配置profile文件
@ComponentScan
数据链路层
Springboot启动流程图解-源码解析
ApiServer
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。
context.setEnvironment(environment)设置上下的环境信息
@EnableAutoConfiguration
物理层
@Import
DeferredImportSelector
0 条评论
下一页