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