refresh()
1.获取Bean Factory
2.初始化BeanFactory
3.调用invokeBeanFactoryPostProcesser:解析配置类,创建BeanDefinition;执行各种BeanFactoryPostProcessor接口的postProcessBeanFactory(beanFactory)方法
4.调用registerBeanPostProcessors方法:注册Bean的后置处理器
5.调用finishBeanFactoryInitialization方法:完成Bean的实例化和初始化
5.1调用getSingleton(beanName)判断单例池中是否有这个Bean
5.2判断是否有@DependsOn注解,有则首先实例和初始化依赖Bean
5.3调用getSingleton(String beanName, ObjectFactory<?> singletonFactory)方法
5.3.1调用singletonFactory.getObject()方法,即createBean方法
5.3.1.1实例化指定bean之前先调用InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法,如果返回Bean则直接返回,否则调用doCreateBean方法
5.3.1.1.1调用doCreateBean方法
5.3.1.1.1.1调用createBeanInstance方法实例化Bean
5.3.1.1.1.2调用MergedBeanDefinitionPostProcess接口的PostProcessMergedBeanDefinition方法,其中一个实现类CommonAnnotationBeanPostProcessor的PostProcessMergedBeanDefinition方法将类中以@PostConstruct和@PreDestroy标注的方法找出并分别放入集合中
5.3.1.1.1.3调用populateBean方法完成自动装配
5.3.1.1.1.4调用initializedBean方法
5.3.1.1.1.4.1调用invokeAwareMethod方法,调用各种实现Aware接口的方法,包括BeanNameAware、BeanFactoryAware和BeanClassLoaderAware接口
5.3.1.1.1.4.2调用applyBeanPostProcessorsBeforeInitialization方法调用各种BeanPostProcessor接口的postProcessBeforeInitialization(Object bean, String beanName)方法,其中包括CommonAnnotationBeanPostProcessor的postProcessBeforeInitialization(方法由父类InitDestroyAnnotationBeanPostProcessor实现)方法,这里用来执行之前找到的以@PostConstruct标注的方法;还有ApplicationContextAwareProcessor,在postProcessBeforeInitialization方法中调用了ApplicationContextAware的setApplicationContext方法
5.3.1.1.1.4.3调用invokeInitMethods方法,如果当前bean实现了InitializingBean接口则调用afterPropertiesSet()方法;
如果bean有init-method方法(即在xml配置bean时,init-method所指定的方法),则执行该方法
5.3.1.1.1.4.4调用applyBeanPostProcessorsAfterInitialization,执行各种BeanPostProcessor接口的postProcessAfterInitialization(Object bean, String beanName)方法
5.3.1.1.1.5调用registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd)方法,判断如果bean实现了DisposableBean接口,则将bean注册到销毁回调bean集合中
5.3.2调用addSingleton(beanName, singletonObject)方法,将刚创建好的bean放入单例池中