余腾

导航

Spring源码思维提示

1、创建ClassPathXmlApplicationContext对象 
2、根据传入配置文件的值设置需要解析的配置文件
3、refresh 特别重要13个模板方法 
	1、准备刷新 prepareRefresh()设置容器的启动时间、关闭、激活标志位、初始化事件集合和监听器集合
		  1)initPropertySources()初始化一些属性设置子类自定义个性的属性设置方法
  		  2)getEnvironment().validateRequiredProperties()检验属性的合法等
  		  3)this.earlyApplicationEvents = new LinkedHashSet<>()保存容器中的一些早期事件
	2、***obtainFreshBeanFactory()***特别重要方法返回一个工厂
		1、判断是否有bean工厂如果有删除所有的bean以及关闭原有bean工厂
		2、创建一个DefaultListBeanFactory
		3、解析你传入的配置文件 首先根据beanFactory创建一个XmlBeanDefinitionReader
		4、经过N多个loadBeanDefinitions在XmlBeanDefinitionReader中通过InputStream读取到你传入的配置文件
		5、执行doLoadBeanDefinitions将配置文件解析成一个又一个的Document对象
		6、创建BeanDefinitionDocumentReader解析Document
		7、parseBeanDefinitions将beanNames和beanDefinition放入一个ConcurrentHashMap并且将beanNames放入一个带 volatile的List集合
	3、prepareBeanFactory 准备工厂 上述只有beanNames和beanDefinition 这里对bean工厂进行一些必要的设置
 			1)设置BeanFactory的类加载器,支持表达式解析器...
   			 2)添加部分的BeanPostProcessor【ApplicationContextAwareProcessor】
   			 3)设置忽略的自动装配的接口EnvironmentAware,EmbeddedValueResolverAware...
 	                                 4)注册可以解析的自动装配我们直接在任何组件中自动注入
 				     BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext
  			 5)添加BeanPostProcessor【ApplicationListenerDetector】
 		                 6)添加编译的AspectJ
   			 7)给BeanFactory中注册一些能用的组件
	4、postProcessBeanFactory 后置处理器Bean 工厂默认为空方法需要实现BeanFactoryPostProcessor 接口去自定义
	5、invokeBeanFactoryPostProcessors 调用bean工厂后置处理器 开始调用我们自己实现的接口 
		调用顺序: 如果有的话,首先调用 bean定义注册后置处理器 、
				     后bean工厂后置处理器  	
	6、registerBeanPostProcessors 注册bean后置处理器,只是注册但是不会调用反射
	7、initMessageSource 国际化问题 先判断bean工厂中是否有这个bean如果没有就创建设置国际化
	8、初始化应用程序 事件多路广播  初始化自定义的事件监听多路广播器,(观察者模式)
		先判断是否有多播器没有就new一个后放入bean工厂
	9、onRefresh()空方法 具体的子类可以在这里初始化一些特殊的Bean (在初始化singleton beans 之前)
	10、registerListeners:给容器中将所有项目里面的ApplicationListener注册进来
		1)从容器中拿到所有的ApplicationListener
    		2)将每个监听器添加到事件派发器中
 			     getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)
  	                3)派发之前步骤产生的事件
   			 getApplicationEventMulticaster().multicastEvent(earlyEvent)
	11、finishBeanFactoryInitialization: 初始化所有的bean方法特别重要 IOC所有的准备都是为了实例化bean以及AOP
		首先讲解一下bean的初始化
	              1.beanFactory.preInstantiateSingletons()
		  1)获取容器中所有的Bean,依次进行初始化和创建对象
		  2)获取Bean的定义信息RootBeanDefinition
		  3)Bean不是抽象的,是单实例的,是懒加载
		       1)判断是否是工厂Bean,是否是实现了FactoryBean的接口bean
		       2) 不是工厂bean 利用getBean(beanName) 创建对象
		             0)getBean(beanName) ioc.getBean()
		             1)doGetBean(name,null,null,false)
		             2)先获取缓存中保存的单实例Bean.如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)(一级缓存)
            			private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256)
		            3)缓存获取不到,开始Bean的创建对象流程
 		            4)标记当前bean已经被创建
 	                            5)获取bean的定义信息
     		            6)获取当前bean依赖的其它bean如果按照getBean()把依赖的Bean先创建出来
                                            7)启动单实例Bean的创建流程 
			       1)createBean(beanName, mbd, args)
         			       2)Obeject bean = resolveBeforeInstantiation(beanName, mbd)可以提前获取代理对象
             				 InstantiationAwareBeanPostProcessor提前执行
              				 先触发applyBeanPostProcessorsBeforeInstantiation()
     			                 如果有返回值触发applyBeanPostProcessorsAfterInitialization()
            		                       3)如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象则调用4)
           			       4)Object beanInstance = doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args)创建Bean
			      	    1)创建Bean实例createBeanInstance(beanName, mbd, args)
            				     利用工厂方法或者对象的构造器创建出Bean的实例
       				     2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
             				    调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
          			    	    3)【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper)
					赋值之前
					1)拿到InstantiationAwareBeanPostProcessor后置处理器
              					     postProcessAfterInstantiation()
              				                 2)拿到InstantiationAwareBeanPostProcessor后置处理器
                				   postProcessPropertyValues()
           				     ====赋值之前===
                 				3)应用Bean属性的值为属性利用setter方法等进行赋值
              					     applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs)
            					 4)【Bean初始化】initializeBean(beanName, exposedObject, mbd)
           					      1)【执行Aware接口方法】invokeAwareMethods(beanName,bean)执行xxxAware接口的方法
                					    BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
             					      2)【执行后置处理器初始化之前】applyBeanPostProcessorsBeforeInitialization(bean, beanName)
               						     BeanPostProcessor.postProcessBeforeInitialization()
             					     3)【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd)
                 				        1)是否是InitializingBean接口的实现执行接口规定的初始化
             	    				        2)是否自定义初始化方法
                				     4)【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization
                    					BeanPostProcessor.postProcessAfterInitialization()
              					    5)注册Bean的销毁方法
                                                                                   5)将创建的Bean添加到缓存中singletonObjects
		Bean的生命周期可以简单的理解为以下
		1、Bean的实例化
		2、bean属性注入(如果set注入必须有对应的set方法)
		3、判断是否实现了Aware接口(这个接口是给我们自己的bean注入spring容器自带的bean)
			Aware执行顺序 BeanNameAware、BeanFactoryAware、ApplicationContextAware
		4、调用BeanPostProcessor的postProcessBeforeInitialization 初始化方法如果我们想重写可以自己写一个类实现BeanPostProcessor
		5、调用InitalizingBean的afterBean方法 
		6、调用我们自己的自定义初始化方法
		7、调用BeanPostProcessor的postProcessAfterInitialization  AOP就是基于这里实现的
		8、返回正常的bean
		9、容器关闭
		10、调用自定义的destroy()方法

		
	12、发布事件与清楚上下文环境	finishRefresh()清楚上下级资源缓存
	13、创建一些必须的缓存resetCommonCaches
	
				

posted on 2021-12-08 13:18  余腾  阅读(28)  评论(0编辑  收藏  举报

Fork me on Gitee