Spring源码学习
源码学习
前提
版本:5.3.10
形式:注册形式-AnnotationConfigApplicationContext(AppConfig.class)
学习内容
spring启动注册过程
this() 阶段
- 创建AnnotationConfigApplicationContext实例
- 创建AnnotatedBeanDefinitionReader实例
默认注册几个注解相关的bean后置处理器-注册到beanDefinitionMap ConfigurationClassPostProcessor AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor EventListenerMethodProcessor DefaultEventListenerFactory
- 创建ClassPathBeanDefinitionScanner实例
- 创建AnnotatedBeanDefinitionReader实例
register(componentClasses);
- 注册配置类-存入beanDefinitionMap;
refresh();
-
prepareRefresh();
准备开始注册前的一些属性
1、比如active、startupDate 属性复制
2、initPropertySources();执行子类扩展方法
3、检查必须的环境变量
4、初始化earlyApplicationListeners和earlyApplicationEvents 属性; -
obtainFreshBeanFactory();
获取一个刷新的beanFactory-》其refresh设置为true 对后续的功能可能有影响。
-
prepareBeanFactory()
准备BeanFactory
1、添加注册器ApplicationContextAwareProcessor 用于处理实现xxxAware接口的bean --- 备注:重点功能,后续可在自定义的bean中直接获取使用以下类中给的属性
EnvironmentAware EmbeddedValueResolverAware ResourceLoaderAware ApplicationEventPublisherAware ApplicationContextAware MessageSourceAware ApplicationStartupAware
2、使用 ignoreDependencyInterface() 将上面这些类不能通过属性方式自动注入(但可以通过 @Autowire注入)
3、使用 registerResolvableDependency()将下面的这些类设置为不能用getbean()获取到但可以使用@autowire注入:
BeanFactory ResourceLoader ApplicationEventPublisher ApplicationContext
4、添加ApplicationListenerDetector bean后置处理器;用于探测ApplicationListener类型的bean注册到ApplicationContact中
5、直接使用registerSingleton()方法将以下类注册到容器单例池singletonObjects中
environment systemProperties systemEnvironment applicationStartup
-
postProcessBeanFactory(beanFactory)
子类扩展;
-
invokeBeanFactoryPostProcessors(beanFactory);
1、从beanDefinitionNames中遍历获得BeanDefinitionRegistryPostProcessor类型bean名称--->这里默认就一个:ConfigurationClassPostProcessor
2、从manualSingletonNames中遍历获得BeanDefinitionRegistryPostProcessor类型的bean名称-->无
3、获取所得到的BeanDefinitionRegistryPostProcessor进行注册并添加到currentRegistryProcessors中,供后续使用【以下是注册bean对象的步骤(这里就已ConfigurationClassPostProcessor为例)】
4、invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); //执行当前注册处理器的postProcessor.postProcessBeanDefinitionRegistry(registry);方法来获得更多的bean定义【重点】执行doGetBean()方法进行注册internalConfigurationAnnotationProcessor: 1、从singletonObjects中获取当前注册的bean是否存在 2、markBeanAsCreated(beanName) //标记当前bean为创建中-->alreadyCreated 3、getMergedLocalBeanDefinition(beanName); //获取去bean定义,并进行相应的处理 4、String[] dependsOn = mbd.getDependsOn(); //获取当前beanName所依赖的,当前Bean创建之前dependsOn所依赖的Bean必须已经创建好了 5、createBean(beanName, mbd, args);//创建bean 5.1、resolveBeanClass(mbd, beanName); //确保bean定义被加载了 5.2、resolveBeforeInstantiation(beanName, mbdToUse); //实例化前执行 5.2.1、hasInstantiationAwareBeanPostProcessors();判断如果存在InstantiationAwareBeanPostProcessor类型的bean处理器,则执行postProcessBeforeInstantiation()方法做自定义实例化前处理 5.3、doCreateBean(beanName, mbdToUse, args); 5.3.1、createBeanInstance(beanName, mbd, args);//创建实例 5.3.1.1、determineConstructorsFromBeanPostProcessors(beanClass, beanName);//获取构造方法 5.3.1.2、instantiateBean(beanName, mbd);//上述没有获取到指定构造方法,则使用默认的构造实例化 5.3.1.2.1、getInstantiationStrategy();//初始化策略默认是CglibSubclassingInstantiationStrategy; this()阶段实例化AbstractAutowireCapableBeanFactory时默认写入的 5.3.1.2.2、instantiate(mbd, beanName, this);//执行实例化返回实例 5.3.2、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);//执行beanPostProcess.postProcessMergedBeanDefinition();【备注:当前的bean处理器必须是MergedBeanDefinitionPostProcessor的实现】,默认情况下只有先前注册的ApplicationListenerDetector处理器,来探测监听器bean 5.3.3、addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 将并添加到三级缓存-处理循环依赖 singletonFactories--Map、registeredSingletons --Set两个都要放 5.3.4、populateBean(beanName, mbd, instanceWrapper);//属性填充 5.3.4.1、执行bean后置处理器方法postProcessAfterInstantiation()【InstantiationAwareBeanPostProcessor类型】 5.3.4.2、执行bean后置处理器方法postProcessProperties()【InstantiationAwareBeanPostProcessor类型】:这里主要会发生依赖注入的处理例如@Autowired 5.3.5、initializeBean(beanName, exposedObject, mbd);//初始化 5.3.5.1、invokeAwareMethods(beanName, bean); //执行Aware的方法【备注:如果当前bean有实现,则会执行赋予某种功能:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware】 5.3.5.2、applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//执行beanPostPrecess.postProcessBeforeInitialization()方法,所有的【备注:这里会有Aware功能的处理,在this()阶段特殊处理的那几个Aware接口例如:EnvironmentAware等就在这里执行ApplicationContextAwareProcessor的postProcessBeforeInitialization()方法时进行处理】。 5.3.5.3、invokeInitMethods(beanName, wrappedBean, mbd);//初始化 5.3.5.3.1、如果当前bean有实现InitializingBean接口,则执行afterPropertiesSet()方法 5.3.5.3.2、如果有设置initMethod则执行该方法 5.3.5.4、applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//执行所有beanPostPrecess的postProcessAfterInitialization()方法。 6、addSingleton(beanName, singletonObject);//添加到单例池 singletonObjects、registeredSingletons中
1、执行ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry().processConfigBeanDefinitions(registry): 解析配置类扫描满足的bean定义注册到beanDefinitionMap中 2、invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);执行ConfigurationClassPostProcessor.postProcessBeanFactory(beanFactory);方法 2.1、enhanceConfigurationClasses(beanFactory);// 增强配置类,代理加了Configuration注解的配置类 2.2、beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));//添加一个BeanPostProcessor; 3、invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); // 执行手动添加的普通BeanFactoryPostProcessor的postProcessBeanFactory()方法 4、执行扫描出来的【满足bean定义的但没注册到单例池中的bean定义】普通BeanFactoryPostProcessor注册到单例池中 4.1、讲注册的bean后置处理器分为:priorityOrderedPostProcessors【实现 PriorityOrdered.class的】、orderedPostProcessorNames【实现 Ordered.class的】、nonOrderedPostProcessorNames【其余的】 4.2、依次执行beanPostProcessor.postProcessBeanFactory();priorityOrderedPostProcessors、nonOrderedPostProcessorNames、nonOrderedPostProcessors;
-
registerBeanPostProcessors(beanFactory);
1、 beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);//获取bean定义中的的BeanPostProcess类型定义进行划分成priorityOrderedPostProcessors【实现 PriorityOrdered.class的】、orderedPostProcessorNames【实现 Ordered.class的】、nonOrderedPostProcessorNames【其余的】
2、并将这些beanPostProcessor注册到beanFactory中beanFactory.addBeanPostProcessor(postProcessor);
-
initMessageSource();
设置ApplicationContext的MessageSource,要么是用户设置的,要么是DelegatingMessageSource
-
initApplicationEventMulticaster();
1、注册applicationEventMulticaster多播器,来支持监听器功能,默认SimpleApplicationEventMulticaster
-
onRefresh();
1、给子类的扩展点,可已注册特殊的类等。
-
registerListeners();
1、把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件
-
finishBeanFactoryInitialization(beanFactory);
1、实例化所有在beanDefinitionMap中单还没有实例化到单例池中的没有@Lazy的bean.
-
finishRefresh();
1、clearResourceCaches();//删除context层resource缓存
2、initLifecycleProcessor()//初始化lifecycleProcessor的bean默认为:DefaultLifecycleProcessor;
3、publishEvent(new ContextRefreshedEvent(this));//发布ContextRefreshedEvent事件。表示容器初始化完毕可监听该事件启动自己需要的监听器,spring默认会触发ScheduledAnnotationBeanPostProcessor来开启定时任务。
原文地址:https://blog.csdn.net/qq_39771919/article/details/135504207
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!