Spring容器启动和初始化过程实际上可以分为两个阶段,第一个阶段是容器的初始化,包括容器的创建,bean配置文件读取,解析和BeanDefinition的生成及注册。第二个阶段是bean的实例化,从beanDefinition到bean实例的生成,包括aop的切入等。
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
concurrentTemplate = (AbstractConcurrentTemplate) context.getBean("tairConcurrentTemplate");
上面简单两行,已经包括了Spring的初始化和实例化过程。
Spring中Bean的实例化的触发时机包括主要两类,一步是在初始化结束后,一个是getBean触发时。
bean的实例化过程实际上在AbstractApplicationContext.refresh()时就开始了,具体的入口为:refresh->finishBeanFactoryInitialization->beanFactory.preInstantiateSingletons(),preInstantiateSingletons的实现在DefaultListableBeanFactory类中。
DefaultListableBeanFactory中preInstantiateSingletons的具体逻辑为:
public void preInstantiateSingletons() throws BeansException {