关注微信公众号【行走在代码行的寻路人】获取Java相关资料,分享项目经验及知识干货。
以下测试的源码地址:
https://github.com/877148107/Spring-Annotation
Spring容器创建过程:
refresh():【容器刷新】
-
prepareRefresh();【刷新前的预处理】
-
initPropertySources();初始化容器中的一些属性设置。提供给子类自定义个性化属性设置的方法
-
getEnvironment().validateRequiredProperties();检验属性合法
-
earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;
-
-
obtainFreshBeanFactory();【获取BeanFactory】
-
refreshBeanFactory();刷新创建beanFactory,并设置一个序列id
new DefaultListableBeanFactory(getInternalParentBeanFactory());
-
getBeanFactory();获取刚刚创建的BeanFactory对象,并返回
-
-
prepareBeanFactory(beanFactory);BeanFactory的预备工作,进行一些设置
-
设置bean的类加载器。表达式解析器
-
添加BeanPostProcessor(ApplicationContextAwareProcessor)
-
设置一些忽略的自动装备接口EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、MessageSourceAware等等
-
注册可以解析的自动装配,我们可以自定义实现这些接口注入组件
-
添加BeanPostProcessor(ApplicationListenerDetector)
-
注册默认的环境中能使用的bean:ConfigurableEnvironment、Map<String, Object>、
-
-
postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作
-
子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
-
-
invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法
-
先判断BeanFactory是否是BeanDefinitionRegistry和BeanDefinitionRegistryPostProcessor类型的分别放入不同的list
-
获取所有bean类型为BeanDefinitionRegistryPostProcessor
-
执行实现PriorityOrdered。
postProcessor.postProcessBeanDefinitionRegistry(registry);
-
执行实现Ordered
postProcessor.postProcessBeanDefinitionRegistry(registry);
-
最后执行没有实现任何优先级接口的
postProcessor.postProcessBeanDefinitionRegistry(registry);
-
-
再执行postProcessor.postProcessBeanFactory(beanFactory);
-
获取所有bean类型为BeanFactoryPostProcessor
-
先执行实现PriorityOrdered
postProcessor.postProcessBeanFactory(beanFactory);
-
在执行实现Ordered
postProcessor.postProcessBeanFactory(beanFactory);
-
最后执行没有实现任何优先级的接口
postProcessor.postProcessBeanFactory(beanFactory);
-
-
-
registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)(拦截器bean的创建)
-
获取所有bean类型为BeanPostProcessor
-
先注册实现了PriorityOrdered接口的BeanPostProcessor
-
再注册实现了Ordered接口的BeanPostProcessor
-
最后注册没有实现任何优先级接口的BeanPostProcessor和MergedBeanDefinitionPostProcessor
-
注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener
-
-
initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析)
-
获取getBeanFactory()
-
看容器中是否有id为messageSource的,类型是MessageSource的组件;如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
-
把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
-
-
initApplicationEventMulticaster();初始化事件派发器;
-
获取getBeanFactory()
-
从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;
-
如果上一步没有配置;创建一个SimpleApplicationEventMulticaster
-
将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入
-
-
onRefresh();容器刷新
-
子类重写方法在容器刷新的时候自定义逻辑
-
-
registerListeners();注册监听器
-
从容器中拿到所有的ApplicationListener
-
将每个监听器都放入ApplicationEventMulticaster监听派发器里面
-
-
finishBeanFactoryInitialization(beanFactory);初始化剩下的单实例bean
-
获取容器中所有的bean依次进行初始化和创建bean对象
-
获取bean定义信息RootBeanDefinition
-
判断是否是抽象、是否单实例、是否懒加载
-
判断bean是否是FactoryBean类型,不是bean工厂类型就getBean-doGetBean
-
从缓存中获取单实例bean,getSingleton(beanName),获取到直接返回
-
开始创建bean流程
-
获取bean定义信息RootBeanDefinition
-
获取bean依赖的bean先将它们创建
-
createBean(beanName, mbd, args);
-
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);先拦截返回一个代理对象
-
先利用BeanPostProcessor执行postProcessBeforeInstantiation
-
再利用BeanPostProcessor执行postProcessAfterInitialization
-
-
没有代理对象开始创建doCreateBean
-
createBeanInstance;创建一个bean实例
-
调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition
-
populateBean;给bean赋值
-
获取InstantiationAwareBeanPostProcessor执行postProcessAfterInstantiation
-
获取InstantiationAwareBeanPostProcessor执行postProcessPropertyValues
-
applyPropertyValues(beanName, mbd, bw, pvs)应用Bean属性的值;为属性利用setter方法等进行赋值;
-
-
initializeBean(beanName, exposedObject, mbd);初始化Bean
-
invokeAwareMethods(beanName, bean);执行执行Aware接口方法
-
执行后置处理初始化之前的方法applyBeanPostProcessorsBeforeInitialization:beanProcessor.postProcessBeforeInitialization(result, beanName);
-
invokeInitMethods(beanName, wrappedBean, mbd);调用初始化方法
-
执行后置处理器初始化之后的方法applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);beanProcessor.postProcessAfterInitialization(result, beanName);
-
-
registerDisposableBeanIfNecessary(beanName, bean, mbd);注册并创建bean销毁方法
-
-
-
-
-
finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成
-
initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor
-
默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor(); 加入到容器
-
拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
-
publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;
-
-
总结
-
Spring容器在启动的时候,会先保持所有注册进来的bean的定义信息(xml配置和注解的bean)
-
Spring容器会在适当的时候创建这些bean,用到这个bean的时候getBean创建Bean,并保持在容器中,然后统一创建剩下的所有bean(finishBeanFactoryInitialization)
-
BeanPostProcessor后置处理器(重要)
-
每个bean创建完成后都会获取容器中的所有后置处理器进行处理来增强这些bean功能。比如:AnnotationAwareAspectJAutoProxyCreator来实现AOP功能的、AutowiredAnnotationBeanPostProcessor来实现自动注入的、等等xxxBeanPostProcessor
-
-