八.Spring之实例创建流程

除了BeanPostProcessor、BeanFactory、Listener等特殊实例,大部分业务代码实例是在finishBeanFactoryInitialization(beanFactory);这一步实例化的。

对finishBeanFactoryInitialization(beanFactory)打断点来看看 单实例的创建流程。

单元测试

	@Test
	public void test01(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConifgOfAutowired.class);
		
		BookService bookService = applicationContext.getBean(BookService.class);
		System.out.println(bookService);
		
		applicationContext.close();
	}

配置类,扫描的包里有自定义的类就行。

@Configuration
@ComponentScan({"com.atguigu.service","com.atguigu.dao",
	"com.atguigu.controller","com.atguigu.bean"})
public class MainConifgOfAutowired {
   
   

beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean

preInstantiateSingletons方法

  1. 获取容器中的所有Bean,依次进行初始化和创建对象
  2. 获取Bean的定义信息;RootBeanDefinition
  3. 判断Bean不是抽象的,是单实例的,不是懒加载,满足条件则进行下一步;
  4. 判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
  5. 不是工厂Bean。利用getBean(beanName);创建对象

不是工厂Bean。利用getBean(beanName);创建对象

在将所有单实例创建完成后,会执行实现SmartInitializingSingleton实例的 afterSingletonsInstantiated 方法。

getBean方法

再进入doGetBean

  1. transformedBeanName 返回bean的规范名称
  2. Object sharedInstance = getSingleton(beanName); 从缓存中寻找bean

如何从缓存中寻找:会把单例的bean实例放到 singletonObjects 一个 线程安全的map中

回到doGetBean,如果缓存中有就执行完成,如果缓存没有 继续创建。

把断点调试到当前bean没有缓存的实例。 一个自定义的 Service

进行校验和标记

获取bean定义,先创建依赖的bean, 和创建当前bean一样,依然是调用 BeanFactory.getBean 去创建依赖bean

如果bean是单例的,就通过getSingleton创建bean

getSingleton方法

先看 sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {}),第二个参数是匿名内部类,一个 工厂。

singletonObject = singletonFactory.getObject();是在得到bean,下个标题讲这个方法

singletonFactory.getObject()得到bean后,进行异常处理、创建完成后续工作

看看addSingleton方法,是对缓存的处理 singletonObjects 和 registeredSingletons 加缓存,singletonFactories和earlySingletonObjects减缓存

AbstractBeanFactory.createBean

getSingleton参数new了一个工厂去createBean 创建实例,执行getSingleton就会进入createBean方法。

断点进入的是 AbstractAutowireCapableBeanFactory

resolveBeforeInstantiation 

InstantiationAwareBeanPostProcessor. postProcessBeforeInstantiation   在创建实例前执行

InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation  在创建实例后执行

bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

 bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); 

执行BeanPostProcessor的 AfterInitialization ,在实例初始化后执行

doCreateBean(beanName, mbdToUse, args);

前面的InstantiationAwareBeanPostProcessor 没有能得到实例,则执行doCreateBean方法。

断点来到 AbstractAutowireCapableBeanFactory.doCreateBean

1.createBeanInstance(beanName, mbd, args); 是真正用反射创建实例的方法。

2.创建实例后,执行MergedBeanDefinitionPostProcessors

属性赋值、初始化 

Bean属性赋值 populate方法

以下是populateBean方法

InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation  在创建实例后执行

  还是InstantiationAwareBeanPostProcessor 执行 postProcessPropertyValues

applyPropertyValues,用set方法设置属性

Bean初始化 initializeBean(beanName, exposedObject, mbd)

回到doCreateBean ,设置了属性后,执行initializeBean

invokeAwareMethods ,判断bean如果实现了Aware接口,设置对应的Aware组件注入。

applyBeanPostProcessorsBeforeInitialization,遍历BeanPostProcessors 执行 postProcessBeforeInitialization

invokeInitMethods,执行bean的初始化方法。

自定义初始化方法有很多种方式 https://blog.csdn.net/u014203449/article/details/86665963

applyBeanPostProcessorsAfterInitialization,遍历BeanPostProcessors

 到此为止,bean的初始化完成

registerDisposableBeanIfNecessary

回到 doCreateBean 方法。registerDisposableBeanIfNecessary 注册销毁方法

执行完这步,doCreateBean就执行完成,createBean也执行完成,回到了 getSingleton方法,继续讲过的加入Singleton缓存等步骤。

猜你喜欢

转载自blog.csdn.net/u014203449/article/details/105835520
今日推荐