当前位置: 首页 > news >正文

Spring容器的refresh()方法

           refresh()方法是Spring容器启动的核心方法,主要有下面12个核心步骤。

1.prepareRefresh()

       准备上下文刷新,重置相关状态和属性。时间戳记录、状态管理、日志输出、环境初始化事件、监听器管理、早期事件收集。

2.obtainFreshBeanFactory()

       获取BeanFactory。

3.prepareBeanFactory(beanFactory)

       配置BeanFactory的标准上下文特性,如类加载器、表达式解析器等属性。

4.postProcessBeanFactory(beanFactory)

       允许子类对BeanFactory进行后处理操作。下面是一个子类实现。(不同子类实现不同)

5.invokeBeanFactoryPostProcessors(beanFactory)

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}

        实例化并调用所有已注册的BeanFactoryPostProcessor ,并遵循指定的顺序(如果有的话)。此方法必须在单例Bean实例化之前被调用。

        其中BeanFactoryPostProcessor有多种实现,有些需要排序,有些不需要排序,导致执行的顺序也是不一样了。

6.registerBeanPostProcessors(beanFactory)

          注册bean的工厂后处理器,用于解析@Autowried已经@Resource以及@PostConstruct等需要Bean后处理器解析的注解。

7.initMessageSource()

     初始化上下文的消息源,用于国际化支持。

8.initApplicationEventMulticaster()

     初始化应用事件发布器。

protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);if (logger.isTraceEnabled()) {logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isTraceEnabled()) {logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");}}}
  •  检查容器中是否已定义了应用事件多播器bean
  •  如果未定义,则创建默认的SimpleApplicationEventMulticaster实例

9.onRefresh()

          该方法是模板方法,具体实现在不同的ApplicationContext容器中处理不一样。

10.registerListeners()

protected void registerListeners() {// Register statically specified listeners first.for (ApplicationListener<?> listener : getApplicationListeners()) {getApplicationEventMulticaster().addApplicationListener(listener);}// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let post-processors apply to them!String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);for (String listenerBeanName : listenerBeanNames) {getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);}// Publish early application events now that we finally have a multicaster...Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;this.earlyApplicationEvents = null;if (earlyEventsToProcess != null) {for (ApplicationEvent earlyEvent : earlyEventsToProcess) {getApplicationEventMulticaster().multicastEvent(earlyEvent);}}}

           注册监听器容器自带的监听器,获取容器中其它配置的监听器。发布容器的早期事件。

11.finishBeanFactoryInitialization(beanFactory)

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.beanFactory.preInstantiateSingletons();}

        做一些初始化的工作,如果没有其他Bean后处理器(如PropertyPlaceholderConfigurer)注册嵌入值解析器,清理临时类加载器,调用freezeConfiguration()方法缓存所有Bean定义元数据,实例化所有剩余的非懒加载单例bean,这是整个Spring容器初始化过程中的关键一步,真正创建Bean实例

12.finishRefresh()

protected void finishRefresh() {// Clear context-level resource caches (such as ASM metadata from scanning).clearResourceCaches();// Initialize lifecycle processor for this context.initLifecycleProcessor();// Propagate refresh to lifecycle processor first.getLifecycleProcessor().onRefresh();// Publish the final event.publishEvent(new ContextRefreshedEvent(this));// Participate in LiveBeansView MBean, if active.LiveBeansView.registerApplicationContext(this);}

    完成刷新过程的最后步骤,发布相应的上下文刷新完成事件。主要步骤如下:

  • 清理资源缓存;
  • 初始化生命周期处理器(LifecycleProcessor);
  • 调用生命周期处理器的 onRefresh() 方法;
  • 发布上下文刷新完成事件(ContextRefreshedEvent);
  • 注册当前上下文到 LiveBeansView MBean(若启用)。
http://www.dtcms.com/a/494267.html

相关文章:

  • 接口测试难点总结
  • 《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》
  • php 网站换空间网站打开慢如何优化
  • html5商城网站模板泰州网站制作工具
  • 浅谈SQL审核(一):SQL审核实现方式与常见工具的选择
  • 贪玩手游官方网站论文答辩免费ppt模板下载
  • Linux 上可以同时安装并运行 MySQL 和 PostgreSQL
  • Python Arrow库:告别datetime繁琐,优雅处理时间与时区
  • SQL 处理问题(删除大表数据、查询慢、统计不准、锁超时)
  • 佛山外贸网站建设效果一个网站突然打不开
  • 中国建设网官方网站硅灰wordpress 表格边框
  • php做音乐网站17zwd一起做网站官网
  • 犀牛云做网站编辑上传网站建设文件
  • 装饰公司网站建站网站后台管理无法编辑
  • 网站建设中upl连接网站开发教案
  • 整站优化外包公司中国域名注册
  • 再网站里做商家店铺网页素材大宝库
  • 精湛的网站建设免费的企业宣传模板
  • 做网站在哪个地方买空间wordpress 图片展示插件
  • 网站域名维护有赞分销
  • 中邮保险网站wordpress主题游戏cms
  • 普兰店网站建设公司潍坊专业环保设备
  • 惠济区建设局网站做7寸照片的网站
  • 论文中引用网站怎么写网站的代理页面怎么做
  • 用什么做网站方便网页认证
  • 暖色调网页设计网站创意广告设计网站
  • 百度网站链接优化网站排名方法
  • 四川通管局网站贵阳市建设城乡规划局网站
  • 长沙做网站比较好的公司网站模板论坛
  • 企业网站seo案例单页网站下载