在spring中核心进行bean的初始化的方法是AbstractAutowireCapableBeanFactory 类的 doCreateBean 方法,生命周期的全部大致流程都在这里进行了描述
分别是:1 创建实例 ;2 填充属性 3 初始化
//AbstractAutowireCapableBeanFactory 类
//创建bean的过程
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
//如果是单例,先从缓存中进行获取,如果获取的到,则直接使用
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
//如果缓存中没有,则创建bean实例
if (instanceWrapper == null) {
//【核心】创建实例
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
//获取bean实例
Object bean = instanceWrapper.getWrappedInstance();
//获取bean的类型
Class<?> beanType = instanceWrapper.getWrappedClass();
//设置一下BeanDefinition中bean最终的目标类型
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
//允许后置处理器修改合并后的bean定义
//在spring中的bean定义可以通过多种方法,比如说xml、注解,java配置
//这些配置最终需要进行合并,通过MergedBeanDefinitionPostProcessor对这些合并后的bean进行一步修改增强
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {