BeanFactoryDefaultListableBeanFactory里面有 BeanDefinitionMap、beanPostProcessors、单例池1、创建DefaultListableBeanFactory2、创建AnnotatedBeanDefinitionReader传入DefaultListableBeanFactory3、创建ClassPathBeanDefinitionScannerrefresh方法涉及模板设计模式 父类方法子类实现refresh方法 给beanfactory设置一些东西1、prepareRefresh -》initpropertysource往environment加东西、 getEnvironment.validateRequiredProperties() 验证是否具有某属性2、obtainFreshBeanFactory() -》refreshBeanFactory两个实现子类 web支持重复刷新另一个不支持重复刷新 返回bean工厂 annotationConfigApplicationContext与annotationConfigwebApplicationContext创建bean工厂的位置不同3、prepareBeanFactory(beanFactory)添加类加载器、EL解析器、类型转化器、baenPostProcessor处理aware回调、配置相关的beanapplicationContext、第二个baenPostProcessor、第三个baenPostProcessor添加环境变量4、postProcessBeanFactory(beanFactory);6、invokeBeanFactoryPostProcessors(beanFactory); 把beanFactory传进去然后扫描得到beandefinition放到beanFactory里面来7、registerBeanPostProcessors(beanFactory);8、initMessageSource(); 支持国际化 messageSource 赋值给applicationContext属性9、initApplicationEventMulticaster();设置事件发布器广播器调用事件监听器放到单例池 simpleApplicationEventMulticaster线程池--------------------------------------------------------------------------------Executor executor getTaskExecutor(); return this.taskExecutor; for (ApplicationListener? listener : getApplicationListeners(event, type)) { if (executor ! null) { executor.execute(() - invokeListener(listener, event)); } else { invokeListener(listener, event); } }10、// 给子类的模板方法 onRefresh();11、registerListeners(); 事件监听器 被事件发布器调用1、实现ApplicationListener接口 payloadApplicationEvent对象 applicationListenerDetector2、EventListener注解12、finishBeanFactoryInitialization(beanFactory);ConversionService、占位符解析器lambda表达式Environment、preInstantiateSingletons--实例化非懒加载的单例bean13、finishRefresh(); 启动完成 smartlifecycleBeanFactoryPostProcessorbeanDefinitionRegistryPostProcessor---BeanFactory的后置处理器 BeanPostProcessor ---- Bean对象的后置处理器依赖注入autowired先执行回调再执行依赖注入bytype模式不会被调用先register后refresh