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 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring 是一个轻量级的 Java 开发框架,由...
Spring框架的启动流程是其核心功能之一,其中`refresh()`方法起到了至关重要的作用。当我们调用`ApplicationContext`的`refresh()`方法时,Spring容器开始初始化并加载配置,为应用程序提供服务。下面我们将深入分析...
在Spring框架中,`refresh()`方法是启动和更新Spring应用程序上下文的关键步骤。这个方法主要分为以下几个阶段: 1. **准备预处理(prepareRefresh())**: 在这一阶段,Spring容器会记录启动时间、标记容器为活动...
### Spring源码refresh方法调试笔记 #### 一、概述 `refresh` 方法是Spring框架中的一个核心方法,它主要用于初始化整个应用上下文(ApplicationContext),包括加载配置文件、创建Bean实例等重要步骤。本文将深入...
SpringSecurity-JWT-VERSION2(AccessToken和RefreshToken) version1太复杂,无法优化。accessToken refreshToken流安全登录处理流程详细说明转到博客文章JWT异常处理安全异常处理(AuthenticationEntryPoint,...
在本文中,我们将详细探讨Spring框架中的IOC容器启动过程,特别是`refresh()`方法及其相关方法调用流程,从而深入理解Spring如何初始化并管理Bean。 #### 1. 准备刷新阶段 - `prepareRefresh()` 在`refresh()`方法...
- `spring_refresh`涉及的是Spring容器的刷新操作,它允许在运行时更新容器的配置,重新加载Bean定义,这对于热部署或动态调整配置非常有用。 这些文件可能包含的视频内容涵盖了从创建Bean到初始化,再到依赖注入...
SpringIOC refresh()初始化代码实例 SpringIOC refresh()初始化代码实例是 Spring 框架中一个非常重要的初始化步骤,本文将详细介绍 SpringIOC refresh()初始化代码实例的实现机制,并对相关的代码进行详细的解释。...
实践方志鹏博客搭建Springcloud+RabbitMQ+Config-client+config-server Eureka-server的微服务架构,通过/bus/refresh接口触发所有config-client自动从config-server重新读取配置文件。SpringCloud和SpringBoot版本...
- [springcloud(七):配置中心svn示例和refresh](http://www.ityouknow.com/springcloud/2017/05/23/springcloud-config-svn-refresh.html) - [springcloud(八):配置中心服务化和高可用]...
spring-cloud-config-svn-refresh:配置中心svn版本示例,客户端refresh版本示例 spring-cloud-config-eureka:配置中心服务化和高可用代码示例 spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心...
22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...
22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...
22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...
22. Spring源码阅读refresh-invokeBeanFactoryPostProcessor-1.mp4 23 Spring源码阅读 refresh-invokeBeanFactoryPostProcessor-2.mp4 24 Srping源码阅读refresh-invokeBeanFacotryPostProcessor-3.mp4 25 Spring...
`refresh()` 方法是 `ApplicationContext` 初始化和更新的关键步骤,它启动了一个复杂的过程,确保Spring容器能正确地加载和配置所有的Bean。下面我们将深入探讨 `refresh()` 方法的各个步骤以及其背后的原理。 ...
通过 `/refresh` 端点,我们可以触发客户端重新从配置中心获取配置,无需重启服务。这在运行时调整配置参数时非常有用。 **六、安全性考虑** 如果配置包含敏感信息,应启用安全功能。Spring Cloud Config 可以与 ...
本次为spring解析配置文件中spring.xml的过程,并且根据解析的spring.xml中的节点加载bean到map中。
spring-cloud-config-svn-refresh:配置中心svn版本示例,客户端refresh版本示例 spring-cloud-config-eureka:配置中心服务化和高可用代码示例 spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心...
### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...