spring中IOC设计与实现

1、BeanFactory

1.1、BeanDefinition类结构

1.2、BeanFactory类结构

2、ApplicationContext

2.1、类层次结构

2.2、AbstractApplicationContext刷新时序图

prepareRefresh :初始化属性源(PropertySource)及环境(Environment)

obtainFreshBeanFactory:主要是refreshBeanFactory和getBeanFactory,refreshBeanFactory有些实现类,如AbstractRefreshableApplicationContext是加载BeanDefinition,自定义BeanFactory。

prepareBeanFactory:添加PropertyEditorRegistrar,添加BeanPostProcessor,比如ApplicationContextAwareProcessor、ApplicationListenerDetector、LoadTimeWeaverAwareProcessor,添加需要忽略的依赖接口ignoreDependencyInterface(EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware、ApplicationStartup),注册可解析的依赖registerResolvableDependency(BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext),在查找findAutowireCandidates会用到,注册一些单例(environment,systemProperties,systemEnvironment,applicationStartup)

postProcessBeanFactory:后置处理BeanFactory,在WebApplicationContext中,会另外添加一些BeanPostProcessor。

invokeBeanFactoryPostProcessors:调用PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

  • BeanFactory是BeanDefinitionRegistry的实例,将BeanFactoryPostProcessor分为两类,一类是BeanDefinitionRegistryPostProcessor,另一类是正常的BeanFactoryPostProcessor,同时对于BeanDefinitionRegistryPostProcessor,调用postProcessBeanDefinitionRegistry。对于实现BeanDefinitionRegistryPostProcessor和PriorityOrdered的bean,排序后依次调用postProcessBeanDefinitionRegistry,然后对于实现BeanDefinitionRegistryPostProcessor和Ordered的bean,排序后依次调用postProcessBeanDefinitionRegistry,对于其它的,则排序后依次调用 postProcessBeanDefinitionRegistry,调用BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的postProcessBeanFactory
  • BeanFactory不是BeanDefinitionRegistry的实例,直接调用postProcessBeanFactory

registerBeanPostProcessors:调用PostProcessorRegistrationDelegate.registerBeanPostProcessors注册BeanPostProcesor。获取实现了BeanPostProcessor的Bean,分为三类,实现PriorityOrder,Order及没有次序的。

initMessageSource:初始化消息源。

initApplicationEventMulticaster:初始化事件发布器。

onRefresh:在具体的上下文子类中初始化其它特殊的bean

registerListeners:注册特殊的监听器,添加实现了ApplicationListener的bean到监听器中,同时 发布可以早期发布的事件。

finishBeanFactoryInitialization:设置ConversionService,添加EmbeddedValueResolver,创建实现LoadTimeWeaverAware的Bean实例,冻结配置,调用beanFactory.preInstantiateSingletons实例化所有的非惰性初始化的单例,触发所有bean实例的初始化的回调(即实现SmartInitializingSingleton)。

finishRefresh:清除资源缓存(clearResourceCaches),初始化生命周期处理器(initLifecycleProcessor),传递fresh到生命周期处理器(即实现LifeCycle的 bean调用start),发布ContextRefreshedEvent事件。

2.3、BeanDefinition的载入

(1)解析属性id,name,同时name当作别名,如果id为空,则将第一个别名作为beanName,同时检查名字的唯一性 

  (2) 解析class,parent,基于此创建GenericBeanDefinition

(3) 解析bean属性,singleton,scope,abstract,lazy_init,autowire,depends-on,autowire-candidate,primary,init-method,destory-method,factory-method,factory-bean属性

(4)解析子结点的meta结点

(5)解析子结点的lookup-method结点

(6)解析子结点的replace-method结点

(7)解析constructor-arg子结点,解析index,type,name,ref,value属性,ref,value属性只能有其中一个。其子结点下只能有一个子结点。可能有下面几中子结点bean,ref,idref,value,null,array,list,set,map,props

(8)解析子结点property

(9)解析子结点qualifier

3、Bean创建

3.1、创建实例策略类

有三种方式来实例化,一种通过BeanDefinition中的定义的beanClass,通过其获取默认构造函数来实体化,另外一种是通过指定的构造器实体化,最后一种是通过工厂方法来实例化

3.2 bean创建时序图

 BeanPostProcessor在bean创建时序过程中调用顺序为

  1. MergedBeanDefinitionPostProcessor
  2. InstantiationAwareBeanPostProcessor
  3. SmartInstantiationAwareBeanPostProcessor(解决循环依赖)
  4. BeanPostProcessor

4、BeanPostProcessor

4.1、类结构

BeanPostProcessor:允许自定义修改bean实例的工厂钩子

InstantiationAwareBeanPostProcessor:BeanPostProcessor的子接口,用于添加实例化之前回调及实例化后显示属性调协或者autowire发生前的回调

MergedBeanDefinitionPostProcessor:在合并Bean定义时的后置处理回调

SmartInstantiationAwareBeanPostProcessor:InstantiationAwareBeanPostProcessor接口的扩展,添加预测处理bean的最终类型的回调。在创建实例时应用,包含确定使用构造函数,及针对循环依赖时的早期引用处理。

DestructionAwareBeanPostProcessor:BeanPostProcessor的子接口,用于添加销毁前的回调

5、bean属性

5.1、类层次结构

6、type转换

6.1、类层级结构

主要包含Converter及Formatter

7、BeanFactoryPostProcessor

7.1、类结构图

8、MessageSource

用于国际化的接口,其类图结构为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值