new SpringApplication(AppBarrageRobotApplication.class)
-->initialize
-->deduceWebEnvironment()
---> webEnvironment (根据classPath下有没有"javax.servlet.Servlet","org.springframework.web.context.ConfigurableWebApplicationContext"来确定是不是web项目 )
springApplication.run()-->
加载所有SpringApplicationRunListener 比较重要的一个EventPublishingRunListener
prepareEnvironment() 预处理spring环境
--> EventPublishingRunListener事件发布器 --> 发布ApplicationEnvironmentPreparedEvent事件
--> BootstrapApplicationListener监听该事件
--> 创建SpringApplicationBuilder
--> 创建SpringApplication
--> 启动上一步创建的SpringApplication springApplication.run() 与上面步骤一致
加载所有SpringApplicationRunListener 比较重要的一个EventPublishingRunListener
prepareEnvironment() 预处理spring环境
--> EventPublishingRunListener事件发布器 --> 发布ApplicationEnvironmentPreparedEvent事件
--> BootstrapApplicationListener监听该事件
--> 发现已经执行过了(environment.getPropertySources().contains(BOOTSTRAP_PROPERTY_SOURCE_NAME)),退出
--> 创建AnnotationConfigApplicationContext
--> 执行applicationContext.refresh() 这一步是加载spring本身的一些配置,与我们的代码应用关系不大,具体作用待查
根据webEnvironment来创建ConfigurableApplicationContext 在父类GenericApplicationContext 中的构造函数创建DefaultListableBeanFactory()
1 web --> AnnotationConfigEmbeddedWebApplicationContext
2 普通 --> AnnotationConfigApplicationContext
--> 构造方法中会创建AnnotatedBeanDefinitionReader ClassPathBeanDefinitionScanner
-->AnnotatedBeanDefinitionReader会将
ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
EventListenerMethodProcessor
DefaultEventListenerFactory
作为RootBeanDefinition加入到beanFactory中的beanDefs中
--> prepareContext() 该步骤会将new SpringApplication(AppBarrageRobotApplication.class)的AppBarrageRobotApplication加入到beanFactory中
--> refreshContext() --> 执行applicationContext.refresh()
--> afterRefresh() 执行ApplicationRunner CommandLineRunner接口的run方法
applicationContext.refresh()
--> prepareRefresh()
--> obtainFreshBeanFactory()
--> prepareBeanFactory() 为beanFactory设置参数
添加 BeanPostProcessor
ApplicationContextAwareProcessor
ApplicationListenerDetector
注册可解析依赖
BeanFactory
ResourceLoader
ApplicationEventPublisher
ApplicationContext
--> postProcessBeanFactory()由子类重写
--> invokeBeanFactoryPostProcessors()
找到BeanDefinitionRegistryPostProcessor的实现类并执行其postProcessBeanDefinitionRegistry()方法 比较重要的一个ConfigurationClassPostProcessor
找到BeanFactoryPostProcessor实现类 并执行postProcessBeanFactory()方法
--> registerBeanPostProcessors() 注册BeanPostProcessor
ConfigurationPropertiesBindingPostProcessor
CommonAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
ConfigurationPropertiesBeans
此时spring中共9个BeanPostProcessor
ApplicationContextAwareProcessor
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
PostProcessorRegistrationDelegate$BeanPostProcessorChecker
ConfigurationPropertiesBindingPostProcessor
ConfigurationPropertiesBeans
CommonAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
ApplicationListenerDetector
--> initMessageSource() 初始化messageSource组件
--> initApplicationEventMulticaster() 初始化任务派发器 默认是SimpleApplicationEventMulticaster
--> onRefresh() 由子类实现
--> registerListeners() 往刚刚的任务派发器里面注册监听
--> finishBeanFactoryInitialization() --> preInstantiateSingletons() 实例化单例bean(non-lazy-init的)
--> finishRefresh() 刷新完成 web项目会在这里启动servlet容器 EmbeddedWebApplicationContext#startEmbeddedServletContainer()
--> initLifecycleProcessor() 创建生命周期处理器 默认DefaultLifecycleProcessor
--> getLifecycleProcessor().onRefresh() 调用DefaultLifecycleProcessor的onRefresh()方法,找出实现了Lifecycle接口的对象,并执行其 start()方法
--> publishEvent() 通过任务派发器发布ContextRefreshedEvent事件
参数不记录了
applicationContext.getBean()-->AbstractApplicationContext#getBean()-->AbstractBeanFactory#getBean()-->doGetBean()
doGetBean(beanName)
--> getSingleton(beanName)
先从singletonObjects中获取
没有的话就从earlySingletonObjects中获取
否则就从singletonFactories中获取ObjectFactory对象 singletonFactory
获取ObjectFactory成功的话
singletonObject = singletonFactory.getObject();
earlySingletonObjects.put(beanName, singletonObject);
singletonFactories.remove(beanName);
还是获取不到的话就开始加载
--> getMergedLocalBeanDefinition() 合并beanDefinition,比如合并parent的属性 生成RootBeanDefinition
--> mbd.getDependsOn()得到依赖,循环依赖执行getBean()
--> getSingleton(beanName,ObjectFactory)
--> beforeSingletonCreation() singletonsCurrentlyInCreation.add(beanName)
--> ObjectFactory.getObject()-->AbstractAutowireCapableBeanFactory#createBean();
--> doCreateBean()
--> createBeanInstance() 推断构造函数创建实例 用BeanWrapperImpl封装
--> applyMergedBeanDefinitionPostProcessors() 找到实现MergedBeanDefinitionPostProcessor接口的类,调用postProcessMergedBeanDefinition
--> addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory)重要
singletonFactories.put(beanName, singletonFactory);
earlySingletonObjects.remove(beanName);
registeredSingletons.add(beanName);
--> populateBean() 填充属性
invokeAwareMethods()
看bean是否实现了BeanNameAware BeanClassLoaderAware BeanFactoryAware接口,实现了的话就调对应的set方法
找到所有InstantiationAwareBeanPostProcessor执行postProcessAfterInstantiation()方法 如:AutowiredAnnotationBeanPostProcessor
根据mbd.getResolvedAutowireMode() 来确定用什么方式(byName byType)来找到各个属性的值 默认是byType
找到所有InstantiationAwareBeanPostProcessor执行postProcessPropertyValues()方法
如:AutowiredAnnotationBeanPostProcessor
--> findAutowiringMetadata
找出配置了Autowired Value注解的属性或者方法
封装成AutowiredFieldElement或者AutowiredMethodElement 用InjectionMetadata来统一管理
执行InjectionMetadata的inject方法
执行里面每个Element的inject方法
反射将值赋给属性
--> applyPropertyValues() 其余属性注入
--> initializeBean() 执行bean初始化
得到所有BeanPostProcessor实现类 执行postProcessBeforeInitialization方法
如果bean实现了InitializingBean接口,那么就执行bean的afterPropertiesSet方法
得到所有BeanPostProcessor实现类 执行postProcessAfterInitialization方法
--> afterSingletonCreation()
singletonsCurrentlyInCreation.remove(beanName)
--> addSingleton()
singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
singletonFactories.remove(beanName);
earlySingletonObjects.remove(beanName);
registeredSingletons.add(beanName);
--> getObjectForBeanInstance() 针对FactoryBean做处理
如果bean是FactoryBean类型
--> getObjectFromFactoryBean()-->doGetObjectFromFactoryBean() --> 执行这个factoryBean的getObject()方法获取真正的对象