spring生命周期 & 容器启动过程
2022-04-15 10:06:47 5 举报
AI智能生成
spring从起的初始化和启动过程详解,吐血整理,一图在手打败天下无敌手
作者其他创作
大纲/内容
1.DelegatingApplicationContextInitializer 这个类可以从环境中读取context.initializer.classes配置的类,进行监听 的触发
2.ContextIdApplicationContextInitializer 获取contextid并注册到容器中(项目名)
3.SharedMetadataReaderFactoryContextInitializer 添加了CachingMetadataReaderFactoryPostProcessor
外框
ApplicationContextInitializer.initializespringBoot的主要几种实现有
初始化SpringContextrefresh方法前
1.添加ApplicationContextAwareProcessor
2.添加ApplicationListenerDetector
为BeanFactory添加高优先级的BeanFactoryPostProcessor
1b style=\
2.systemProperties - java相关的参数
3.systemEnvironment-系统参数路径等
注册了Bean
prepareBeanfactory准备beanFactory
子类ServletWebServerApplicationContext是AnnotationConfigServletWebServerApplicationContext的父类 主要是添加了WebApplicationContextServletContextAwareProcessor(beanFactory.addBeanPostProcessor)
postProcessBeanFactory这个是抽象方法
AbstractApplicationContext.refresh
applicationContext目前有几种主要实现1.AnnotationConfigServletWebServerApplicationContext-springboot启动后会创建该容器2.AnnotationConfigApplicationContext
Context初始化完成开始刷新容器
第一步:调用通过context的addBeanFactoryPostProcessor添加的BeanDefinitionRegistry的方法postProcessBeanDefinitionRegistry
第二步:从beanFactory中获取即实现了BeanDefinitionRegistryPostProcessor又实现了PriorityOrdered的Processor,排序后调用但是晚于通过context的addBeanFactoryPostProcessor添加的
第三步:从beanFactory中获取即实现了BeanDefinitionRegistryPostProcessor又实现了Ordered的Processor,排序后依次调用
执行方法postProcessBeanDefinitionRegistry这个方法发生在所有的内部的bean定义被加载后 (比如之前生命周期方法中加入的各种Processor),可以对已经加载的bean进行修改和新增bean的定义
1.执行BeanDefinitionRegistry接口
比如 ConfigurationClassPostProcessor在这个环节被调用,会将带有@Configuration的类增强,生成代理类并替换掉bean定义中的class这个环节也可以增加BeanPostProcessor
第一步:调用既实现了b style=\
第二步:最后调用非BeanDefinitionRegistryPostProcessor的postProcessBeanFactory调用顺序的逻辑同上
第三步:再处理前两步中可能再次产生的BeanFactoryProcessor,也是按照PriorityOrdered ,Ordered 和非排序要求的processor 依次调用通过查看源码,普通的BeanFactoryProcessor的postProcessBeanFactory中再注册BeanFactoryProcessor时可以生效,如果下一层再注册会被忽略(不然死循环了)
执行方法postProcessBeanFactory
2.执行BeanFactoryPostProcessor接口
invokeBeanFactoryPostProcessors 这一步是触发所有的BeanFactory的生命周期方法
触发BeanFactoryPostProcessor生命周期方法
AutowiredAnnotationBeanPostProcessor
和调用一样,根据PriorityOrdered、内部processor(MergedBeanDefinitionPostProcessor)、Ordered和非Ordered将beanPostProcessor分组(内部和PriorityOrdered可重复) 最终通过beanFactory.addBeanPostProcessor注册processor注册顺序为 PriorityOrdered -> Ordered -> 普通的 -> MergedBeanDefinitionPostProcessor如果addBeanPostProcessor时,beanFactory中已经存在了,则移除,然后添加至list的末尾
注册beanPostProcessor
和执行BeanFactory一样,优先注册abstractApplicationContext中存在的监听然后添加beanFactory容器中所有类型为ApplicationListener的监听bean(不支持Ordered接口)
注册监听器
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
spring其中之一内置的实现1.AnnotationAwareAspectJAutoProxyCreator 这个会在此创建代理类对象
执行postProcessBeforeInstantiation如果实现接口的方法postProcessBeforeInstantiation返回对应的bean实例那么就跳过创建bean的过程(用实现类返回的bean,不需要调用构造创建了)
1.执行InstantiationAwareBeanPostProcessor接口
1.AutowiredAnnotationBeanPostProcessor该类实现接口,用来实现@Lookup,封装mehtodOverride元数据放入BeanDefinition中为后期的方法覆盖准备Lookup作用:通常用在一个单例的bean注入一个非单例的bean时候,一旦注入了非单例的bean也变得单例了,所以会定义一个返回非单例bean方法,在方法上面加上Lookup注解,在调用方法的时候spring会自动每次从容器中进行getBean,实现非单例的逻辑,基本原理就是代理类覆盖含有lookUp的方法会在determineCandidateConstructors中将beanDefinition 中的overrideMethod中加入此方法
如果实现了该接口的方法determineCandidateConstructors能够返回构造函数则使用返回的构造函数来创建bean对象
2.执行SmartInstantiationAwareBeanPostProcessor接口
1.CommonAnnotationBeanPostProcessor 该类实现JSR-250、WebServiceRef、EJB 3中的注解比如 PostConstruct、PreDestroy(这两个通过继承InitDestroyAnnotationBeanPostProcessor实现)、 Resource、WebServiceRef 这个类主要是构建ResourceMetadata(处理Resource、WebServiceRef,EJB)
2.InitDestroyAnnotationBeanPostProcessor 实现bean的PostConstruct、PreDestroy 这两个环节元数据的构建,放入Processor的缓存中
3.AutowiredAnnotationBeanPostProcessor 处理@Autowired、@Value、 @Inject(JSR-330)、@Lookup
调用bean的构造方法创建出来bean后会触发方法postProcessMergedBeanDefinition
3.执行MergedBeanDefinitionPostProcessor接口
实现该接口的类有
执行接口的方法postProcessAfterInstantiation
1.AutowiredAnnotationBeanPostProcessor 执行autowired和value注解的注入
AbstractAutoProxyCreator类实现了该接口在执行getEarlyBeanReference时能够生成代理类,注入到依赖的bean中
2.执行SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference如果有循环依赖问题,可以返回替代早期对象的对象
执行接口的方法postProcessProperties
applyPropertyValues
4.执行InstantiationAwareBeanPostProcessor接口
1.BeanNameAware
2.BeanClassLoaderAware
3.BeanFactoryAware
5.执行Aware接口
1.EnvironmentAware 设置容器的environment
2.EmbeddedValueResolverAware 获取spring的内置的解析器,用来解析配置文件的内容如:${maodou.service}
3.ResourceLoaderAware 获取ResourceLoader用来获取spring加载的resource
4.ApplicationEventPublisherAware 事件的发布器
5.MessageSourceAware
6.ApplicationContextAware
实现的类有1.ApplicationContextAwareProcessor Application自己实现了触发Aware的其他接口
2.ServletContextAwareProcessor用来设置ServletContext和ServletConfigAware
3.ConfigurationClassPostProcessor 如果一个bean实现了接口ImportAware,并且由@Import进行注册的bean,那么会注入导入这个bean的配置类的所有注解元数据信息 这个类中获取ImportRegistry来实现获取元注解信息
4.ConfigurationPropertiesBindingPostProcessor 将被注解ConfigurationProperties的类绑定PropertySources 即将配置文件中的值注入到类中,比如我们的XXXHttp类
5.InitDestroyAnnotationBeanPostProcessor 调用PostConstruct方法
执行接口方法postProcessBeforeInitialization初始化之前(区别于实例化)
6.执行BeanPostProcessor接口
执行方法afterPropertiesSet
执行init-methodxml方式指定的init-method
7.执行InitializingBean接口
1.AsyncAnnotationBeanPostProcessor 主要是实现代理增强,添加Advisor
2.DistributedLockAopBeanPostProcessor 我们自己实现的分布式锁也在在这个期间进行动态织入
3.SchedulerProxyScheduledLockAopBeanPostProcessor 开源项目 shedlock 也是在这个期间动态织入的
4.PersistenceExceptionTranslationPostProcessor事务实现
5.ScheduledAnnotationBeanPostProcessorspring的任务调度
6.AbstractAdvisorAutoProxyCreator,用来对目标bean进行代理比如某bean的方法使用了事务注解,通过该类创建目标bean的代理对象,并添加调用拦截
执行接口方法postProcessAfterInitialization初始化之前(区别于实例化)
8.执行BeanPostProcessor接口
充分条件1:实现了DisposableBean
充分条件2:实现了AutoCloseable
充分条件3:通过@Bean注册,没有指定destroyMethod,但bean有名字为close或shutdown方法
充分条件4:通过@Bean注册,指定了destroyMethod
充分条件5:有DestructionAwareBeanPostProcessor并且requiresDestruction返回true
单例Bean registerDisposableBean
prototype不注册销毁事件
其他的registerDestructionCallback
9.registerDisposableBean 注册销毁bean的handler
初始化所有的单例bean
springContext创建过程
0 条评论
回复 删除
下一页