以实现了ApplicationContext接口的AnnotationConfigApplicationContext的初始化流程为例

  1. 先进入该类的构造方法中
// 有多个构造方法,此构造方法是传入一个配置类
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
	// 1.调用自己的无参构造,此时会先去调用父类的无参构造,初始化内部的BeanFactory
	// 之后创建AnnotatedBeanDefinitionReader对象用于处理@Bean注解,
	// 又创建ClassPathBeanDefinitionScanner对象,用于扫描类路径上的Bean
        this(); 
	// 2.注册刚才传入的配置类
        this.register(componentClasses); 
	// 3.关键部分,用于创建所有的bean实例
        this.refresh();
    }
  1. 进入refresh方法中
public void refresh() throws BeansException, IllegalStateException {
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            // 初始化Bean工厂,如一些会用到的类加载器和后置处理器
						this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
								// 实例化并调用所有注册的 BeanFactoryPostProcessor 类型的Bean
								// 这一步中,会调用那些包扫描、Bean解析就开始工作了
								// 这步过后,就将包扫描到的Bean注册到BeanFactory中了
                this.invokeBeanFactoryPostProcessors(beanFactory);
								// 实例化并注册所有BeanFactoryPostProcessor 类型的Bean,但并不急着执行
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
								// 检查监听Bean并将这些监听Bean向容器注册
                this.registerListeners();
								// 实例化所有的非懒加载的bean - 核心加载位置
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
								// 完成上述操作后IOC容器也就到了一个基本可用的状态了
            } catch (BeansException var9) {
                if (this.logger.isWarnEnabled()) {
                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
                }

                this.destroyBeans();
                this.cancelRefresh(var9);
                throw var9;
            } finally {
                this.resetCommonCaches();
            }

        }
    }
  1. 进入到preInstantiateSingletons方法中,开始获取bean对象
//跳转到加载bean的方法,核心位置如下
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        …………
        beanFactory.preInstantiateSingletons();
    }
//跟进后是一个接口,查看其实现子类,找到具体的实现方法
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
    void preInstantiateSingletons() throws BeansException;
}
//核心实现代码
public void preInstantiateSingletons() throws BeansException {
				// 列出所有的beanName
        List<String> beanNames = new ArrayList(this.beanDefinitionNames);
        Iterator var2 = beanNames.iterator();
				// 开始初始化所有的bean
        while(true) {
            String beanName;
            Object bean;
            do {
                while(true) {
                    RootBeanDefinition bd;
                    do {
                        do {
                            do {
                               …………
                                beanName = (String)var2.next();
																// 获取bean的定义,但此时bean不能是抽象,不能是原型也不能是懒加载,不然直接看下一个bean
                                bd = this.getMergedLocalBeanDefinition(beanName);
                            } while(bd.isAbstract()); // 不能为抽象
                        } while(!bd.isSingleton());// 不能为原型
                    } while(bd.isLazyInit());// 不能为懒加载

										// 判断是否为工厂bean
                    if (this.isFactoryBean(beanName)) {
                        bean = this.getBean("&" + beanName);
                        break;
                    }
										// 如果不是工厂bean就直接调用getBean方法去获取bean
                    this.getBean(beanName);
            } while(!(bean instanceof FactoryBean));

            FactoryBean<?> factory = (FactoryBean)bean;
            boolean isEagerInit;
            if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                SmartFactoryBean var10000 = (SmartFactoryBean)factory;
                ((SmartFactoryBean)factory).getClass();
                isEagerInit = (Boolean)AccessController.doPrivileged(var10000::isEagerInit, this.getAccessControlContext());
            } else {
                isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean)factory).isEagerInit();
            }

            if (isEagerInit) {
                this.getBean(beanName);
            }
        }
    }