spring启动流程
2021-09-28 11:37:18 2 举报
AI智能生成
超详细的spring启动流程
作者其他创作
大纲/内容
this()
AnnotationConfigApplicationContext()
初始化beanFactory属性<br>在父类GenericApplicationContext中<br>this.beanFactory = new DefaultListableBeanFactory()<br>
初始化read属性<br>this.reader = AnnotatedBeanDefinitionReader(this)
默认属性<br>beanName生成器 BeanNameGenerator beanNameGenerator = AnnotationBeanNameGenerator.INSTANCE<br>scope注解元素解析器 ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver()<br>
创建环境getOrCreateEnvironment(registry)
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry),<br>向beanFactory中注册5个BeanPostProcessor的bean定义<br>
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
初始化scanner属性(bean扫描器)<br>this.scanner = new ClassPathBeanDefinitionScanner(this)<br>
registerDefaultFilters()
spring默认过滤有Component注解的bean,可以在@ComponentScan注解中配置
setEnvironment()设置环境
setResourceLoader()设置资源加载器
register(componentClasses)
this.reader.register(componentClasses)<br>使用1.1.2中创建的reader(AnnotatedBeanDefinitionReader)<br>
doRegisterBean方法
将componentClasses解析成AnnotatedGenericBeanDefinition,是BeanDefinition的一个子类
使用1.1.2.1中的this.scopeMetadataResolver 判断是否有Scope注解,获取属性,设置bean的作用域
使用1.1.2.1中的this.beanNameGenerator 推断bean的名称,设置beanName,假设这里得到的beanName是demoConfig
继续丰富demoConfig的beanDefinition
解析Lazy注解,设置beanDefinition的lazyInit属性<br>
解析Primary注解,设置beanDefinition的primary属性
解析DependsOn注解,设置beanDefinition的dependsOn属性<br>
解析Role注解,设置beanDefinition的role属性
解析Description注解,设置beanDefinition的description属性<br>
创建demoConfig的beanDefinition的持有器
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName)<br>
将beanConfig的beanDefinition注册进IOC容器
在DefaultListableBeanFactory中调用<br>
this.beanDefinitionMap.put(beanName, beanDefinition)
属性beanDefinitionMap是ConcurrentHashMap,存放beanDefinition<br>
this.beanDefinitionNames.add(beanName)
属性beanDefinitionNames是ArrayList,存放beanName
removeManualSingletonName(beanName)
refresh()
prepareRefresh()
设置容器的启动时间、启动状态
initPropertySources() 初始化加载配置文件方法 空方法
getEnvironment().validateRequiredProperties() 检查环境变量
设置属性 earlyApplicationListeners 数据结构是LinkedHashSet
设置属性 earlyApplicationEvents 数据结构是LinkedHashSet
obtainFreshBeanFactory()
refreshBeanFactory()<br>
设置beanFactory的serializationId属性
getBeanFactory()
返回之前获得的beanFactory对象
prepareBeanFactory(beanFactory)
设置beanFactory的属性 beanClassLoader 类加载器
设置beanFactory的属性 beanExpressionResolver bean表达式解析器
设置beanFactory的属性 propertyEditorRegistrars 属性编辑器支持
向beanFactory中添加一个beanPostProcessor ApplicationContextAwareProcessor<br>这是beanFactory的第一个bean后置处理器
BeanPostProcessor接口
Object postProcessBeforeInitialization(Object bean, String beanName)
Object postProcessAfterInitialization(Object bean, String beanName)
设置属性ignoredDependencyInterfaces 添加6个忽略接口类<br>如果某个bean依赖这几个接口的实现类,<br>在自动装配的时候忽略它们,spring会通过其他方式来处理这些依赖
EnvironmentAware<br>EmbeddedValueResolverAware<br>ResourceLoaderAware<br>ApplicationEventPublisherAware<br>MessageSourceAware<br>ApplicationContextAware<br>到这里总共会有9个
设置属性resolvableDependencies,添加4个特殊类<br>如果有bean依赖这几个bean,直接从这里获取注入
BeanFactory<br>ResourceLoader<br>ApplicationEventPublisher<br>ApplicationContext<br>
添加一个BeanPostProcessor ApplicationListenerDetector<br>
注册名为loadTimeWeaver的bean<br>默认不执行
如果存在bean名称为loadTimeWeaver的bean则注册一个BeanPostProcessor
注册3个和环境相关的bean<br>
1. environment,getEnvironment()<br>2. systemProperties, getEnvironment().getSystemProperties()<br>3. systemEnvironment,getEnvironment().getSystemEnvironment()<br>
postProcessBeanFactory(beanFactory)
spring提供的扩展点,待子类实现
invokeBeanFactoryPostProcessors(beanFactory)<br>
总体流程:<br>先执行BeanDefinitionRegistryPostProcessor,<br>再执行BeanFactoryPostProcessor<br>
先执行BeanDefinitionRegistryPostProcessor<br>局部变量:<br>processedBeans:存放所有BeanDefinitionRegistryPostProcessor的名字<br>regularPostProcessors:存放BeanFactoryPostProcessorregistryProcessors:<br>存放BeanDefinitionRegistryPostProcessor<br>currentRegistryProcessors:临时变量,装载BeanDefinitionRegistryPostProcessor<br>
执行参数传入的BeanDefinitionRegistryPostProcessor
执行spring内部提供的
通过beanFactory.getBeanNamesForType()方法<br>找到实现了BeanDefinitionRegistryPostProcessor接口的beanPostProcessor<br>
遍历结果,寻找实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor<br>会得到ConfigurationClassPostProcessor<br>
将得到的后置处理器放入局部变量<br>currentRegistryProcessors<br>processedBeans<br>
currentRegistryProcessors排序<br>
registryProcessors.addAll(currentRegistryProcessors)<br>
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry)
调用ConfigurationClassPostProcessor.processConfigBeanDefinitions(BeanDefinitionRegistry registry)<br>
拿到所有的beanDefinitionNmae <br>String[]candidateNames=registry.getBeanDefinitionNames()<br>
循环所有的beanDefinition找到配置类(Configuration)<br>这里会打标识,标识配置类的类型为Full还是Lite<br>
看用户有没有自定义bean命名方式
配置类解析器ConfigurationClassParserparser,<br>这个类非常重要,下面就是用它来解析对@Component、@Import等注解的<br>
定义两个变量
candidates:需要解析的配置类
这里只有一个DemoConfig元素
alreadyParsed:完成解析的配置类
解析配置类,parser.parse(candidates)<br>
进入ConfigurationClassPaser.processorConfigurationClass()
sourceClass=doProcessConfigurationClass(configClass,sourceClass,filter)
处理@Component注解
处理@PropertySource注解
处理@ComponentScan/@ComponentScans注解
Set<BeanDefinitionHolder>scannedBeanDefinitions=<br>this.componentScanParser.parse(componentScan,sourceClass.getMetadata().getClassName())
定义扫描器ClassPathBeanDefinitionScanner
是否重写了命名规则
解析ComponentScan注解的各个属性<br>
添加排除规则<br>
开始扫描
scanner.doScan(StringUtils.toStringArray(basePackages))
根据包路径,得到符合条件的BeanDefinition
根据传入的basePackage得到扫描路径
根据扫描路径得到该路径下的所有class文件对应的Resource
根据class文件的Resouce通过asm解析得到MetadataReader
从MetadataReader中找到需要spring托管的MetadataReader,<br>将其转化为ScannedGenericBeanDefinition,ScannedGenericBeanDefinition为BeanDefinition的子类<br>
将Resource转化为beanDefinition
遍历BeanDefinition,进一步丰富beanDefinition信息
scope属性<br>
指定beanName
Lazy属性
Primary属性<br>
DependsOn属性
Role属性
Description属性
将BeanDefinition添加到beanFactory
处理@Import注解
如果加了@EnableAspectJAutoProxy<br>这里会注册AspectJAutoProxyRegistrar<br>这就是开启了aop
注册beanDefinition org.springframework.aop.config.internalAutoProxyCreator<br>
注册beanPostProcessor AnnotationAwareAspectJAutoProxyCreator
判断是否强制使用cglib动态代理 proxyTargetClass为true<br>
处理@ImportResource注解
处理@Bean的注解
返回配置类的父类,会在processConfigurationClass(...)方法的下一次循环时解析
创建reader,这个reader与前面ApplicationContext中的reader不是同一个<br>
currentRegistryProcessors.clear()
执行剩下的BeanDefinitionRegistryPostProcessor<br>也就是在上一步中加载到的BeanDefinitionRegistryPostProcessor<br>
执行BeanFactoryPostProcessor<br>
执行开发者调用applicationContext.addBeanFactoryPostProcessor<br>添加的BeanDefinitionRegistryPostProcessor<br>
执行实现了PriorityOrdered接口的BeanFactoryPostProcessor
执行实现了Ordered接口的BeanFactoryPostProcessor
执行剩下的BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类,<br>同样要执行BeanFactoryPostProcessor的方法<br>
registerBeanPostProcessors(beanFactory)<br>对BeanPostProcessor进行注册操作<br>即加到BeanFactory的beanPostProcessors属性中,<br>是一个CopyOnWriteArrayList
将实现了PiorityOrdered的BeanPostProcessor注册到beanFactory<br>
将实现了Ordered的BeanPostProcessor注册到BeanFactory<br>
将不满足上面两个条件的BeanPostProcessor注册到BeanFactory
将所有实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor注册到BeanFactory
initMessageSource<br>国际化与事件处理<br>
如果MessageSource存在就设置一些属性,如果不存在就创建再设置属性。最后注册 到BeanFactory
initApplicationEventMulticaster<br>初始化广播器ApplicationEventMulticaster
如果存在事件广播器就用存在的,如果不存在就创建,再注册到BeanFactory<br>
onRefresh
spring的一个扩展点
registerListeners()<br>注册事件监听器
向广播器中添加AbstractApplicationContext.applicationContextListeners中的监听器
从beanFactory中获取ApplicationListener类型的bean,即为监听器,注册到广播器中
如果有早期事件earlyApplicationEvents
getApplicationEventMulticaster().multicastEvent(earlyEvent)
finishBeanFactoryInitialization(beanFactory)<br>完成bean的初始化
preInstantiateSingletons()<br>
获取beanFactory中的beanNames并遍历
通过beanName获取BeanDefinition,进行条件判断<br>不是抽象类、是单例的且不是懒加载的<br>
遍历调用getBean(beanName)创建bean并将其添加到spring中
确保class被加载
覆写方法
查找代理对象,若有则返回。一般没有的,aop的增强器在这里处理<br>Objectbean=resolveBeforeInstantiation(beanName,mbdToUse)<br>
执行bean实例化前方法<br>applyBeanPostProcessorsBeforeInstantiation(targetType,beanName)<br>
遍历所有的beanPostProcessor执行<br>postProcessBeforeInstantiation方法<br>
当有aop 的时候会执行到AnnotationAwareAspectJAutoProxyCreator其父类<br>AbstractAutoProxyCreator的postProcessBeforeInstantiation<br>这里会开始扫描切面,包装切面方法即切面方法<br>
执行bean实例化后方法<br>applyBeanPostProcessorsAfterInitialization(bean,beanName)<br>
创建springbean
实例化<br>创建实例<br>
使用实例化方法:obtainFromSupplier
使用工厂方法:instantiateUsingFactoryMethod
使用有参构造:autowireConstructor
使用无参构造:instantiateBean
查找属性<br>applyMergedBeanDefinitionPostProcessors<br>
调用后置处理器
CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition<br>查找带有@Resource注解的属性和方法<br>
调用AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition<br>查找带有@Autowired、@Value注解的属性和方法<br>
循环查询父类,从当前类开始,找完当前类就找当前类的父类,直接Object为止
查找属性与方法,属性找到后封装为AutowiredFieldElement,方法找到后封装为AutowiredMethodElement
满足三个条件的话<br>单例bean<br>支持循环依赖<br>bean正在创建<br>
三级缓存池singletonFactories
getEarlyBeanReference()提前生成代理对象<br>
注入属性
AutowiredAnnotationBeanPostProcessor.postProcessProperties处理@Autowired、@Value注解,CommonAnnotationBeanPostProcessor.postProcessProperties处理@Resource注解
处理@Autowired时,先根据类型找到所有的Class,如果有多个,再根据注入属性的名称查找符合的Class,最后调用beanFactory.getBean(...)从spring获取要注入的对象,通过反射机制为对应的属性设置值
初始化bean <br>initializeBean(String,Object,RootBeanDefinition)<br>
1.运行invokeAwareMethods
执行Awarebean的相关方法
2.运行applyBeanPostProcessorsBeforeInitialization<br>//执行spring当中的内置处理器——xxxPostProcessor-------@PostConstruct<br>
运行后置处理器的postProcessBeforeInitialization方法<br>
3.执行InitializingBean初始化
调用bean的初始化方法
如果bean实现了InitializingBean接口,则调用afterPropertiesSet()
执行自定义的初始化方法,即在xml中,通过init-method指定的方法
4.运行applyBeanPostProcessorsAfterInitialization
处理ApplicationListener的,如果有bean实现了ApplicationListener,就是在这里添加到spring的监听器列表的
finishRefresh()<br>完成启动
收藏
0 条评论
下一页