类结构图
BeanFactory
HierarchicalBeanFactory AutowireCapableBeanFactory ListableBeanFactory
ConfigurableBeanFactory
ConfigurableListableBeanFactory
ConfigurableListableBeanFactory
DefaultListableBeanFactory
类继承描述
BeanFactory 的子类为 HierarchicalBeanFactory AutowireCapableBeanFactory ListableBeanFactory 三个类
HierarchicalBeanFactory 的子类为 ConfigurableBeanFactory
BeanFactory -> HierarchicalBeanFactory -> ConfigurableBeanFactory -> ConfigurableListableBeanFactory -> DefaultListableBeanFactory
BeanFactory -> AutowireCapableBeanFactory -> ConfigurableListableBeanFactory -> DefaultListableBeanFactory
BeanFactory -> ListableBeanFactory -> ConfigurableListableBeanFactory -> DefaultListableBeanFactory
BeanFactory 作为spring容器的基类 提供的基本的获取bean的接口
HierarchicalBeanFactory 在 BeanFactory 的基础上提供获取父容器的接口
AutowireCapableBeanFactory 在 BeanFactory 的基础上提供bean自动装配的功能 (三种方式 by_type by_name by_construct)
ListableBeanFactory 在 BeanFactory 的基础上提供获取容器数据的功能即可以拿到容器中所有的beanName 然后可以根据beanName获取bean
ConfigurableBeanFactory 为beanFactory提供表达式解析类型转换的功能以及获取单例的bean的注册机制 以及根据 beanName获取BeanDefinition
ConfigurableListableBeanFactory 作为继承了上面所有的容器 提供给子类继承
doCreate -> beanInstance -> beanInitization
doCreate
第一步 检查该类的beanDefinition是否已经全部解析完成 如果已经完成 实例化前置处理(一般情况是进行代理判断 如果由代理 则生成代理类直接返回 并且进行applyBeanPostProcessorsAfterInitialization处理)
第二步(实例化) 检查缓存工厂中是否存在,如果已有则直接返回 BeanWrapper
第三步 创建 BeanWrapper(包裹实例 用于后面的 propetyValue设置) 中间会有自动注入
第四步 如果有 MergedBeanDefinitionPostProcessor 则对 beanDefinion 进行处理
第五步 如果该bean为单例,且允许循环引用,并且还在创建中 那么将其自动构建一个ObjectFactoruy中添加到SingleFactory中 以便循环引用
第六步 判断是否已经完全处理好,如果处理好则进行实例化之后的处理(实例化后置处理)
第七步 如果 对bean进行填充 自动装配 注入依赖类 以及设置属性
第八步 检查依赖是否已经完全实现,如果依赖已经实现,那么对将要注入的属性值进行一些操作(在工厂将给定的属性值应用到给定的bean之前,对其进行后处理。允许检查是否所有依赖项都已被安全化,例如,基于bean属性设置器上的“必需”注释。还允许替换要应用的属性值,通常通过基于原始属性值创建新的可变属性值实例、添加或删除特定值来实现。默认实现按原样返回给定的pv)
第九步 再次检查依赖,如有异常则抛出
第十步 将上面处理过的PropertyValue属性注入到bean中
第十一步 进行初始化处理
执行 invokeAwareMethods 将Aware的bean设置到bean
执行 applyBeanPostProcessorsBeforeInitialization 进行初始化前的操作
执行 初始化 invokeInitMethods 实质是执行 InitializingBean.afterPropertiesSet() 或者自定义 初始化方法 (一般为@PostConstruct定义的方法)
执行 applyBeanPostProcessorsAfterInitialization 这一步使用 AbstractAutoProxyCreator
AbstractAutoProxyCreator.postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException
AbstractAutoProxyCreator.wrapIfNecessary(Object bean, String beanName, Object cacheKey)
实现代理
第十二步 如果是DisposableBean 需要注册到注销管理器中 以便容器注销时调用
最后返回