不积跬步无以至千里,后继才能薄发
趁着五一假期深入学习一下SpringIOC构建的源码,获益匪浅~
IOC容器是基于 应用上下文类
的子类,因为这个类继承了 ListableBeanFactory
可列表BeanFactory和 HierarchicalBeanFactory
分层BeanFactory ,这两个类继承于 BeanFactory
,然后通过组合的方式把 AutowireCapableBeanFactory
组合进去了,用来支撑DI功能。
1 |
|
关键方法 refresh()
<bean />
标签配置转换为 BeanDefinition
然后把 BeanDefinition
注册到注册中心,并发送注册事件。finishBeanFactoryInitialization(beanFactory);
conversionService
用于类型转换,如controller中入参的转换preInstantiateSingletons()
:初始化/预初始化单例bean
FactoryBean
和普通单例bean,分别调用 AbstractBeanFactory
的 getBean()
方法进行初始化 :
earlySingletonObjects
早期单例map缓存中获取,如果没有则创建一个早期对象,并add进 earlySingletonObjects
。如果找到了这个对象,则直接返回这个对象,不需要再创建了beanDefinition
,如果在当前上下文找不到,就到父容器中找 :找不到这个单例对象,说明还没有初始化,现在开始初始化bean
对应的 beanDefinition
bean
的 dependsOn
属性,避免在这里循环依赖,并把依赖到的 bean
先初始化ObjectFactory
进行创建单例实例,如果是 FactoryBean
还需要多做一步通过这个工厂类创建对应的单例实例 , 核心方法 AbstractAutowireCapableBeanFactory
的 createBean(beanName, mbd, args);
判断是否需要方法重写,如定义了 lookup-method
或 replace-method
,需要经过CGLIB生成新的类
判断是否有代理类需要对 bean
进行增强 InstantiationAwareBeanPostProcessor
1 | Object bean = resolveBeforeInstantiation(beanName, mbdToUse); |
对 bean
进行创建 doCreateBean(beanName, mbdToUse, args)
判断是否是 FactoryBean
,如果不是就实例化 bean
,如果是,则通过这个工厂类创建对应的单例
1 | instanceWrapper = createBeanInstance(beanName, mbd, args); |
factory-method
,如果有则采用工厂方法实例化无参构造
还是 构造函数依赖注入
,使用对应的构造方法解决循环依赖问题
装配成员变量 populateBean(beanName, mbd, instanceWrapper);
PropertyValues
PropertyValues
对象对 bean
进行设值初始化 bean
:initializeBean(beanName, exposedObject, mbd);
BeanNameAware
、 BeanClassLoaderAware
或 BeanFactoryAware
接口,回调BeanPostProcessor
的 postProcessBeforeInitialization()
回调init-method
,或者如果 bean 实现了 InitializingBean
接口,调用 afterPropertiesSet()
方法BeanPostProcessor
的 postProcessAfterInitialization
回调,aop在这里做增强