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