refresh()是 Spring 最核心的方法,没有之一。

核心源码:

public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {//刷新前的预处理;prepareRefresh();//获取BeanFactory;默认实现是DefaultListableBeanFactory,在创建容器的时候创建的ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//BeanFactory的预准备工作(BeanFactory进行一些设置,比如context的类加载器,BeanPostProcessor和XXXAware自动装配等)prepareBeanFactory(beanFactory);try {//BeanFactory准备工作完成后进行的后置处理工作postProcessBeanFactory(beanFactory);//执行BeanFactoryPostProcessor的方法;invokeBeanFactoryPostProcessors(beanFactory);//注册BeanPostProcessor(Bean的后置处理器),在创建bean的前后等执行registerBeanPostProcessors(beanFactory);//初始化MessageSource组件(做国际化功能;消息绑定,消息解析);initMessageSource();//初始化事件派发器initApplicationEventMulticaster();//子类重写这个方法,在容器刷新的时候可以自定义逻辑;如创建Tomcat,Jetty等WEB服务器onRefresh();//注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的registerListeners();//初始化所有剩下的非懒加载的单例beanfinishBeanFactoryInitialization(beanFactory);//完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)finishRefresh();}......}

分析:

Spring容器的refresh()【创建刷新】;
1、prepareRefresh()刷新前的预处理;1)、initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法;2)、getEnvironment().validateRequiredProperties();检验属性的合法等3)、earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;
2、obtainFreshBeanFactory();获取BeanFactory;1)、refreshBeanFactory();刷新【创建】BeanFactory;创建了一个this.beanFactory = new DefaultListableBeanFactory();设置id;2)、getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象;3)、将创建的BeanFactory【DefaultListableBeanFactory】返回;
3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置);1)、设置BeanFactory的类加载器、支持表达式解析器...2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;4)、注册可以解析的自动装配;我们能直接在任何组件中自动注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext5)、添加BeanPostProcessor【ApplicationListenerDetector】6)、添加编译时的AspectJ;7)、给BeanFactory中注册一些能用的组件;environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;1)、子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
======================以上是BeanFactory的创建及预准备工作==================================
5、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;BeanFactoryPostProcessor:BeanFactory的后置处理器。在BeanFactory标准初始化之后执行的;两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor1)、执行BeanFactoryPostProcessor的方法;先执行BeanDefinitionRegistryPostProcessor1)、获取所有的BeanDefinitionRegistryPostProcessor;2)、看先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、postProcessor.postProcessBeanDefinitionRegistry(registry)3)、在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;postProcessor.postProcessBeanDefinitionRegistry(registry)4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;postProcessor.postProcessBeanDefinitionRegistry(registry)再执行BeanFactoryPostProcessor的方法1)、获取所有的BeanFactoryPostProcessor2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、postProcessor.postProcessBeanFactory()3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;postProcessor.postProcessBeanFactory()4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;postProcessor.postProcessBeanFactory()
6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)【 intercept bean creation】不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的BeanPostProcessor、DestructionAwareBeanPostProcessor、InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、MergedBeanDefinitionPostProcessor【internalPostProcessors】、1)、获取所有的 BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级2)、先注册PriorityOrdered优先级接口的BeanPostProcessor;把每一个BeanPostProcessor;添加到BeanFactory中:  beanFactory.addBeanPostProcessor(postProcessor);3)、再注册Ordered接口的4)、最后注册没有实现任何优先级接口的5)、最终注册MergedBeanDefinitionPostProcessor;6)、注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是applicationContext.addApplicationListener((ApplicationListener<?>) bean);
7、initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析);1)、获取BeanFactory2)、看容器中是否有id为messageSource的,类型是MessageSource的组件如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;3)、把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);    MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);
8、initApplicationEventMulticaster();初始化事件派发器;1)、获取BeanFactory2)、从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;3)、如果上一步没有配置;创建一个SimpleApplicationEventMulticaster4)、将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入
9、onRefresh();留给子容器(子类)1、子类重写这个方法,在容器刷新的时候可以自定义逻辑;
10、registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;1、从容器中拿到所有的ApplicationListener2、将每个监听器添加到事件派发器中;getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);3、派发之前步骤产生的事件;
11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;1、beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean1)、获取容器中的所有Bean,依次进行初始化和创建对象2)、获取Bean的定义信息;RootBeanDefinition3)、Bean不是抽象的,是单实例的,是懒加载;1)、判断是否是FactoryBean;是否是实现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<String, Object>(256);获取的3、缓存中获取不到,开始Bean的创建对象流程;4、标记当前bean已经被创建5、获取Bean的定义信息;6、【获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;】7、启动单实例Bean的创建流程;1)、createBean(beanName, mbd, args);2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;【InstantiationAwareBeanPostProcessor】:提前执行;先触发:postProcessBeforeInstantiation();如果有返回值:触发postProcessAfterInitialization()3)、如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;调用44)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);创建Bean1)、【创建Bean实例】;createBeanInstance(beanName, mbd, args);利用工厂方法或者对象的构造器创建出Bean实例;2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);3)、【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper);赋值之前:1)、拿到InstantiationAwareBeanPostProcessor后置处理器;postProcessAfterInstantiation()2)、拿到InstantiationAwareBeanPostProcessor后置处理器;postProcessPropertyValues()=====赋值之前:===3)、应用Bean属性的值;为属性利用setter方法等进行赋值;applyPropertyValues(beanName, mbd, bw, pvs);4)、【Bean初始化】initializeBean(beanName, exposedObject, mbd);1)、【执行Aware接口方法】invokeAwareMethods(beanName, bean);执行xxxAware接口的方法BeanNameAware\BeanClassLoaderAware\BeanFactoryAware2)、【执行后置处理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);BeanPostProcessor.postProcessBeforeInitialization();3)、【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);1)、是否是InitializingBean接口的实现;执行接口规定的初始化;2)、是否自定义初始化方法;4)、【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitializationBeanPostProcessor.postProcessAfterInitialization()5)、注册Bean的销毁方法;5)、将创建的Bean添加到缓存中singletonObjects;ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息。。。。;所有Bean都利用getBean创建完成以后;检查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就执行afterSingletonsInstantiated()12、finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();加入到容器;写一个LifecycleProcessor的实现类,可以在BeanFactoryvoid onRefresh();void onClose(); 2)、    getLifecycleProcessor().onRefresh();拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh()3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;4)、liveBeansView.registerApplicationContext(this);======总结===========1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;1)、xml注册bean;<bean>2)、注解注册Bean;@Service、@Component、@Bean、xxx2)、Spring容器会合适的时机创建这些Bean1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization()3)、后置处理器;BeanPostProcessor1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;AutowiredAnnotationBeanPostProcessor:处理自动注入AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;xxx....增强的功能注解:AsyncAnnotationBeanPostProcessor....4)、事件驱动模型;ApplicationListener;事件监听;ApplicationEventMulticaster;事件派发:

Spring核心方法 refresh 解析相关推荐

  1. Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(二)

    前言 registerBeanPostProcessors initMessageSource 如何实际应用国际化处理 initApplicationEventMulticaster onRefres ...

  2. Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(一)

    前言 Spring 启动流程解析 Refresh 内部方法全解析 prepareRefresh obtainFreshBeanFactory AbstractApplicationContext 类以 ...

  3. AQS的核心方法-acquire()解析

    以下是AQS的acquire()方法源码: public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueu ...

  4. Spring源码深度解析:三、容器的刷新 - refresh()

    一.前言 文章目录:Spring源码深度解析:文章目录 我们先通过Spring源码的整体流程,来了解Spring的工作流程是什么,接着根据这个工作流程一步一步的阅读源码 二.Spring容器的启动 p ...

  5. Spring Cloud Gateway-ServerWebExchange核心方法与请求或者响应内容的修改

    Spring Cloud Gateway-ServerWebExchange核心方法与请求或者响应内容的修改 前提 本文编写的时候使用的Spring Cloud Gateway版本为当时最新的版本Gr ...

  6. Java中高级核心知识全面解析——什么是Spring Cloud、需要掌握哪些知识点?(下)

    目录 一.必不可少的 Hystrix 1.什么是 Hystrix之熔断和降级 2.什么是Hystrix之其他 二.微服务网关--Zuul 1.Zuul 的路由功能 1)简单配置 2)统一前缀 3)路由 ...

  7. Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】

    基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...

  8. spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析

    spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析:通过源码我们发现在分析这个方法之前,此对象已经创建完成实例,内存开辟了空 ...

  9. spring核心功能结构

    spring核心功能结构 Spring大约有20个模块,由1300多个不同的文件构成.这些模块可以分为: 核心容器.AOP和设备支持.数据访问与集成.Web组件.通信报文和集成测试等, 下面是 Spr ...

  10. 自己实现spring核心功能 一

    聊聊spring spring对于java开发者来说,是最熟悉不过的框架了,我们日常开发中每天都在使用它.它有着各种各样的好处,简单易用,得心应手... ... 我们一说到spring就会讲到ioc ...

最新文章

  1. asp.net mvc 3 unobtrusive client side validation not working in IE
  2. centos 6.8 源码安装 erlang/otp 19.0.2
  3. 一份整理 | PyTorch是什么,为何选择它
  4. 喜忧参半的AI,“裸奔”之下的隐私焦虑
  5. ADO.NET 连接Access2007和Access2003
  6. NTP 时间同步流量使用过大 问题解决
  7. lmdb简介——结合MVCC的B+树嵌入式数据库
  8. jmr连接mysql_MYSQL 优化之延迟关联
  9. hdu 3449 有依赖性的01背包
  10. boost::type_erasure模块Associated types相关的测试程序
  11. 14、mysql中事务的应用
  12. java直接读取rar,Java无需解压直接读取Zip文件和文件内容
  13. java web权限设计_java web简单权限管理设计
  14. POJ 2828Buy Tickets
  15. 评测 | 千元以下的扫拖一体机器人,到底值不值得买?
  16. 快讯:Nginx 之父被抓了!
  17. Unity工程导入到AndroidStudio的一些注意事项
  18. 针式打印机windows打印乱码(并口模式与DOS打印测试)
  19. C#长链接转短链接(调用新浪api)
  20. R语言入门与数据分析(1)

热门文章

  1. Java实现163邮箱发送邮件到QQ邮箱
  2. linux qemu的使用教程,详解QEMU网络配置的方法
  3. Linux网络编程 -- Linux常用工具的使用(vim、gcc、gdb、makefile、shell)
  4. 免费电子书下载网站汇总
  5. fgui的ui管理框架_GitHub - zyswx/DCET: Unity3D客户端和.Net Core服务器双端框架,支持FGUI和双端行为树,支持代码全热更(包括FGUI和行为树)...
  6. 计算机休眠状态和关,win7系统关于睡眠和休眠这两种状态的区别
  7. iOS ipa包解析
  8. 新手学编程?选python吧!
  9. 数据分析案例2:股票均线策略(双均线策略收益率12.15%)
  10. Linux—RAID磁盘阵列与阵列卡