前言
AutowireCapableBeanFactory接口的实现类是AbstractAutowireCapableBeanFactory。AutowireCapableBeanFactory接口的作用是通过多种方式创建bean,执行bean的生命周期,bean处理,依赖解决等。AutowireCapableBeanFactory提供的功能实在用得太少了,实在不重要。整个设计,实现比较复杂。但是AbstractAutowireCapableBeanFactory里面一些方法确实整个BeanFactory核心,重要的处理流程。
AutowireCapableBeanFactory详解
public interface AutowireCapableBeanFactory extends BeanFactory {
<T> T createBean(Class<T> beanClass) throws BeansException;
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
void autowireBean(Object existingBean) throws BeansException;
Object configureBean(Object existingBean, String beanName) throws BeansException;
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException;
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
Object initializeBean(Object existingBean, String beanName) throws BeansException;
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
void destroyBean(Object existingBean);
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException;
Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
}
从上面的接口声明的方法看AutowireCapableBeanFactory主要有如下功能
- 手动创建bean
- 手动初始化bean
- 手动销毁bean
- 手动执行BeanPostProcessor对bean的助理
- 通过class获得class对应的beanNaem(详情请看:resolveNamedBean方法的实现)
创建bean
| | 实例化 | 初始化 | 依赖解决 | 完整bean处理流程 | ------------ | ------------ | | autowireBean | 否 | 否 | 是 | 否 | | autowireClass | 是 | 否 | 是 | 否 | | configureBean | 否 | 是 | 是 | 否 | | createBead(Class ) | 是 | 是 | 是| 是|
细节如下
- 如果传递的是object对象,那么就不需要实例化对象了,
- 完整bean处理流程请看第五章 spring-connet之bean生命周期与bean监控 。如果标记为“否”表示只会经历InstantiationAwareBeanPostProcessor接口的对bean的处理。详细请看populateBean方法
- 注意上面所有的方法产生的对象都是非单列对象(所有方法里面有一行这样的代码 bd.setScope(BeanDefinition.SCOPE_PROTOTYPE) ),同时不会进行任何的缓存。
- autowireClass与createBead重载方法中有dependencyCheck是否进行依赖检查,autowireMode形参是表示自动装配模式。dependencyCheck为true表示检查autowireMode模式下的依赖关系
- 注意手动调用容器销毁bean,可能会把依赖的bean也会摧毁
AbstractAutowireCapableBeanFactory
回顾下bean的生命周期与bean监控
- 开始创建bean ,调用createBean()方法
- 执行InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(被resolveBeforeInstantiation方法调用)
- 如果有过有对象返回,
- doCreateBean开始其他流程
- createBeanInstance实例化bean操作,
- 调用determineConstructorsFromBeanPostProcessors方法(该方法会调用SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors方法)
- 实例化bean(实例化方式有两种)
- autowireConstructor()
- instantiateBean()
- applyMergedBeanDefinitionPostProcessors( 方法里面执行MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition)
- populateBean
- InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
- InstantiationAwareBeanPostProcessor.postProcessPropertyValues
- initializeBean
- invokeAwareMethods( 注入aware子接口)
- applyBeanPostProcessorsBeforeInitialization(里面调用BeanPostProcessor.postProcessBeforeInitialization)
- invokeInitMethods(初始化spring bean)
- applyBeanPostProcessorsAfterInitialization(里面调用beanProcessor.postProcessAfterInitialization)
- registerDisposableBeanIfNecessary (检查bean是否需要执行销毁流程)
- createBeanInstance实例化bean操作,
在这鸟菜啊说句:抱歉。这么复杂的源码流程,实在没有办法用一种比较可读,流利的文字给描述出来,大家可以按照文字表示的流程,逐步观看。多看几次,就可以看懂了。
总结
AbstractAutowireCapableBeanFactory就做了两件事
- 手动获得spring bean。主要是解决依赖关系。
- 完整的spring bean生命周期与 spring bean的监控