`

spring refresh()

 
阅读更多

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			//准备启动spring容器,设置容器的启动日期和活动标志
			prepareRefresh();

			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//获得容器ApplicationContext的子类BeanFactory。步骤如下:如果已经有了BeanFactory就销毁它里面的单例Bean并关闭这个BeanFactory。2.创建一个新的BeanFactory。3.对这个BeanFactory进行定制(customize),如allowBeanDefinitionOverriding,allowCircularReferences。4.装载BeanDefinitions(读取配置文件,将xml转换成对应得BeanDefinition)。5.检查是否同时启动了两个BeanFactory。  

			// 通过XmlBeanDefinitionReader加载bean定义.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// 注册 bean processors 
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

			catch (BeansException ex) {
				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}



ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
此方法比较关键,代码也比较多
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		refreshBeanFactory();
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
	}




refreshBeanFactory();
@Override
	protected final void refreshBeanFactory() throws BeansException {
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}



loadBeanDefinitions(beanFactory);
@Override
	protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
		// Create a new XmlBeanDefinitionReader for the given BeanFactory.
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		// Configure the bean definition reader with this context's
		// resource loading environment.
		beanDefinitionReader.setEnvironment(this.getEnvironment());
		beanDefinitionReader.setResourceLoader(this);
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		// Allow a subclass to provide custom initialization of the reader,
		// then proceed with actually loading the bean definitions.
		initBeanDefinitionReader(beanDefinitionReader);
		loadBeanDefinitions(beanDefinitionReader);
	}


loadBeanDefinitions(beanDefinitionReader);装载xml文件到XmlBeanDefinitionReader的过程
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
		Resource[] configResources = getConfigResources();
		if (configResources != null) {
			reader.loadBeanDefinitions(configResources);
		}
		String[] configLocations = getConfigLocations();
		if (configLocations != null) {
			reader.loadBeanDefinitions(configLocations);
		}
	}


postProcessBeanFactory(beanFactory);
关于Spring的BeanPostProcessor就看参考下面的文章
http://blog.csdn.net/chensugang/article/details/3423650




看到几篇比较好的文章,帖一下
http://www.geeekr.com/
http://www.verydemo.com/demo_c143_i11645.html
分享到:
评论

相关推荐

    Spring的refresh()方法相关异常解析

    Spring refresh()方法相关异常解析 Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring 是一个轻量级的 Java 开发框架,由...

    Spring启动流程refresh()源码深入解析

    Spring框架的启动流程是其核心功能之一,其中`refresh()`方法起到了至关重要的作用。当我们调用`ApplicationContext`的`refresh()`方法时,Spring容器开始初始化并加载配置,为应用程序提供服务。下面我们将深入分析...

    Spring教程之refresh()执行逻辑浅析

    在Spring框架中,`refresh()`方法是启动和更新Spring应用程序上下文的关键步骤。这个方法主要分为以下几个阶段: 1. **准备预处理(prepareRefresh())**: 在这一阶段,Spring容器会记录启动时间、标记容器为活动...

    Spring源码refresh方法调试笔记

    ### Spring源码refresh方法调试笔记 #### 一、概述 `refresh` 方法是Spring框架中的一个核心方法,它主要用于初始化整个应用上下文(ApplicationContext),包括加载配置文件、创建Bean实例等重要步骤。本文将深入...

    springSecurity-jwt:JWT access_token和refresh_token

    SpringSecurity-JWT-VERSION2(AccessToken和RefreshToken) version1太复杂,无法优化。accessToken refreshToken流安全登录处理流程详细说明转到博客文章JWT异常处理安全异常处理(AuthenticationEntryPoint,...

    Spring源码解析文件说明

    在本文中,我们将详细探讨Spring框架中的IOC容器启动过程,特别是`refresh()`方法及其相关方法调用流程,从而深入理解Spring如何初始化并管理Bean。 #### 1. 准备刷新阶段 - `prepareRefresh()` 在`refresh()`方法...

    140-150请查阅,谢谢!

    - `spring_refresh`涉及的是Spring容器的刷新操作,它允许在运行时更新容器的配置,重新加载Bean定义,这对于热部署或动态调整配置非常有用。 这些文件可能包含的视频内容涵盖了从创建Bean到初始化,再到依赖注入...

    SpringIOC refresh()初始化代码实例

    SpringIOC refresh()初始化代码实例 SpringIOC refresh()初始化代码实例是 Spring 框架中一个非常重要的初始化步骤,本文将详细介绍 SpringIOC refresh()初始化代码实例的实现机制,并对相关的代码进行详细的解释。...

    SpringCloud消息总线RabbitMQ+Bus-Refresh接口触发所有config-client自动重新读取配置文件

    实践方志鹏博客搭建Springcloud+RabbitMQ+Config-client+config-server Eureka-server的微服务架构,通过/bus/refresh接口触发所有config-client自动从config-server重新读取配置文件。SpringCloud和SpringBoot版本...

    spring-cloud使用的各种示例

    - [springcloud(七):配置中心svn示例和refresh](http://www.ityouknow.com/springcloud/2017/05/23/springcloud-config-svn-refresh.html) - [springcloud(八):配置中心服务化和高可用]...

    spring-cloud-examples

    spring-cloud-config-svn-refresh:配置中心svn版本示例,客户端refresh版本示例 spring-cloud-config-eureka:配置中心服务化和高可用代码示例 spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接3.zip

    22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接4.zip

    22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接2.zip

    22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接1.zip

    22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...

    Spring IoC学习之ApplicationContext中refresh过程详解

    `refresh()` 方法是 `ApplicationContext` 初始化和更新的关键步骤,它启动了一个复杂的过程,确保Spring容器能正确地加载和配置所有的Bean。下面我们将深入探讨 `refresh()` 方法的各个步骤以及其背后的原理。 ...

    SpringCloud——分布式配置中心(Spring Cloud Config)

    通过 `/refresh` 端点,我们可以触发客户端重新从配置中心获取配置,无需重启服务。这在运行时调整配置参数时非常有用。 **六、安全性考虑** 如果配置包含敏感信息,应启用安全功能。Spring Cloud Config 可以与 ...

    5.2、spring-refresh-obtainFreshBeanFactory-parseDefaultElement加载解析bean.vsdx

    本次为spring解析配置文件中spring.xml的过程,并且根据解析的spring.xml中的节点加载bean到map中。

    springcloud微服务框架+服务模版

    spring-cloud-config-svn-refresh:配置中心svn版本示例,客户端refresh版本示例 spring-cloud-config-eureka:配置中心服务化和高可用代码示例 spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心...

    Spring源码分析_Spring_IOC

    ### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...

Global site tag (gtag.js) - Google Analytics