spring启动

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()方法获取真正的对象

									

		

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值