- 浏览: 217428 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
IXHONG:
registerBeanPostProcessors(bean ...
AbstractApplicationContext的refresh()方法简要说明 -
java_frog:
可以读汉字,但一行还是分开了。
FileChannel 读取中文文件解决乱码的一种方法 -
shenselongge:
引用
FileChannel 读取中文文件解决乱码的一种方法 -
string2020:
refresh到底是干啥的。@SpringBootApplic ...
AbstractApplicationContext的refresh()方法简要说明 -
dongpy1111:
最近使用String.format比较多。不晓得这个效率怎样。 ...
String vs StringBuffer vs StringBuilder
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); setConfigLocations(configLocations); if (refresh) { /**spring容器初始化就是调用该方法实现的 *该方法位于AbstractApplicationContext.java类里 */ refresh(); } }
[size=x-large][/size]spring容器的初始化是通过AbstractApplicationContext类里的refresh()方法实现的。AbstractApplicationContext 是容器的最基础的一个抽象父类。也就是说在该里面定义了一个容器初始化的基本流程,流程里的各个方法有些有提供了具体实现,有些是抽象的 ( 因为不同的容器实例不一样 ) ,由继承它的每一个具体容器完成定制。看看 refresh 的基本流程:
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 容器启动的预先准备,记录容器启动的时间和标记 prepareRefresh(); // 创建BeanFactory,如果已有就销毁,没有就创建。此类实现了对BeanDefinition的装载 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 配置BeanFactory标准上下文特性,如类装载器,PostProcesser等 prepareBeanFactory(beanFactory); try { // 在bean被装载后,提供一个修改BeanFactory的入口 postProcessBeanFactory(beanFactory); // 调用postProcessBeanFactory invokeBeanFactoryPostProcessors(beanFactory); // 注册用于拦截bean创建过程中的BeanPostProcessors 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(); // 注册监听器 registerListeners(); // 完成容器的初始化,里面的preInstantiateSingletons()完成对单例对象的创建 finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { // Destroy already created singletons to avoid dangling resources. beanFactory.destroySingletons(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } }
/**
* Prepare this context for refreshing, setting its startup date and * active flag. *容器启动的预先准备,记录容器启动的时间和标记 */ protected void prepareRefresh() { this.startupDate = System.currentTimeMillis(); synchronized (this.activeMonitor) { this.active = true; } if (logger.isInfoEnabled()) { logger.info("Refreshing " + this); } }
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { /*创建BeanFactory,如果已有就销毁,没有就创建。此类实现了对BeanDefinition的装载*/ refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isInfoEnabled()) { logger.info("Bean factory for application context [" + getId() + "]: " + ObjectUtils.identityToString(beanFactory)); } if (logger.isDebugEnabled()) { logger.debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this); } return beanFactory; }
/** * This implementation performs an actual refresh of this context's underlying * bean factory, shutting down the previous bean factory (if any) and * initializing a fresh bean factory for the next phase of the context's lifecycle. *这个实现执行实际的刷新和这个context相关的BeanFactory.关闭前一个BeanFactory,如果存在; *为下一阶段的context的生命周期初始化一个新的BeanFactory */ protected final void refreshBeanFactory() throws BeansException { //如果存在就销毁这个BeanFactory if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { //不存在就创建一个BeanFactory DefaultListableBeanFactory beanFactory = createBeanFactory(); //定制BeanFactory,包括allowBeanDefinitionOverriding允许覆盖BeanDefinition 和 allowCircularReferences 允许循环引用 customizeBeanFactory(beanFactory); //通过XmlBeanDefinitionReader装载BeanDefinitions loadBeanDefinitions(beanFactory); synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException( "I/O error parsing XML document for application context [" + getDisplayName() + "]", ex); } }
/** * Loads the bean definitions via an XmlBeanDefinitionReader. *通过XmlBeanDefinitionReader装载BeanDefinitions * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader * @see #initBeanDefinitionReader * @see #loadBeanDefinitions */ protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws 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.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); }
/**
* Configure the factory's standard context characteristics, * such as the context's ClassLoader and post-processors. *配置BeanFactory标准上下文特性,如类装载器,PostProcesser等 * @param beanFactory the BeanFactory to configure */ protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use the context's class loader. beanFactory.setBeanClassLoader(getClassLoader()); // Populate the bean factory with context-specific resource editors. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this)); // Configure the bean factory with context callbacks. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); // BeanFactory interface not registered as resolvable type in a plain factory. // MessageSource registered (and found for autowiring) as a bean. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); // Detect a LoadTimeWeaver and prepare for weaving, if found. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME) && JdkVersion.isAtLeastJava15()) { // Register the (JDK 1.5 specific) LoadTimeWeaverAwareProcessor. try { Class ltwapClass = ClassUtils.forName( "org.springframework.context.weaving.LoadTimeWeaverAwareProcessor", AbstractApplicationContext.class.getClassLoader()); BeanPostProcessor ltwap = (BeanPostProcessor) BeanUtils.instantiateClass(ltwapClass); ((BeanFactoryAware) ltwap).setBeanFactory(beanFactory); beanFactory.addBeanPostProcessor(ltwap); } catch (ClassNotFoundException ex) { throw new IllegalStateException("Spring's LoadTimeWeaverAwareProcessor class is not available"); } // Set a temporary ClassLoader for type matching. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } }
发表评论
-
方法retry的编写实践版
2014-03-21 15:13 790package com.snda.sysdev.virtua ... -
Http各种状态
2014-03-21 12:21 1019package org.apache.http; pu ... -
java正则简单用列
2014-02-11 23:23 837package com.simple.example; ... -
多线程下生成UUID
2014-01-21 12:10 9695这个实例是验证多线程下使用java.util.UUID生成 ... -
Integer的“==”返回值
2013-10-26 16:06 1023/** * Created by spring o ... -
IP转整数以及整数转IP
2013-09-25 11:30 914IP转整数以及整数转IP,代码见 -
maven编译文件的编码设置
2013-09-25 11:28 977mavan编译时设置编码,配置见 -
FileChannel 读取中文文件解决乱码的一种方法
2013-02-06 15:41 7990package com.lp.liuan; impo ... -
ibatis的动态sql传参语法
2013-02-05 13:34 1731<isNotNull prepend="a ... -
java.util.concurrent源码学习系列--Executor
2012-09-23 14:35 3034Executor的系列类图如下:这一些了类或接口都是和任务提交 ... -
改变线程上下文的类加载器ClassLoader
2012-09-17 17:30 1523/** * Override the thread ... -
BeanFactory和FactoryBean
2012-09-13 21:54 22311、 BeanFactory BeanFact ... -
利用LinkedHashMap实现LRU缓存策略
2012-08-28 13:22 1151利用LinkedHashMap实现移除最近最少使用的缓存策略, ... -
解析时间
2012-08-28 10:33 941这段代码有问题吗? private static Da ... -
使用subList后,原List不允许再进行修改
2012-07-17 13:10 1577import java.util.ArrayList; ... -
转换流学习
2012-06-26 10:21 932package com.amuse.io; imp ... -
java的时间类型和格式化
2012-05-03 20:07 0java中处理时间的类有java.sql.Date和java. ... -
java定时任务
2012-03-14 15:58 1692java的源码为我们提供了一些基础的实现:如Timer类和Ti ... -
用maven创建一个web工程,并用jetty启动
2012-03-14 12:38 88611.用mvn创建一个web应用。 mvn ... -
文件copy工具类的简单实现
2012-03-07 19:07 1072这个工具类是我模仿Spring的工具类实现的,从模仿sprin ...
相关推荐
本文将深入探讨如何在Spring容器初始化Bean和销毁Bean前后执行自定义的操作,以便于进行日志记录、资源清理等任务。 首先,我们需要了解Spring中Bean的生命周期。Bean的生命周期大致分为以下阶段: 1. 实例化:...
Java项目开发用的公用基础模块,包括:Spring容器初始化、配置文件读取工具类、分页对象、Protobuf工具类、反射工具类等
在Spring框架中,Bean的初始化是一个关键的概念,它涉及到Bean的生命周期管理以及Spring容器如何创建、配置和管理这些Bean。本文将深入探讨Spring容器中Bean的初始化过程。 首先,Spring容器根据XML配置文件(如`...
Spring 容器初始化遇到的死锁问题解决 在 Spring 框架中,容器初始化过程中可能会遇到死锁问题,这个问题的出现会导致 Spring 容器卡在那里,不能完成所有 bean 的初始化。今天,我们来讨论这个问题的解决方法。 ...
### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...
主要介绍了Spring容器初始化及问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
`@PostConstruct`是Java EE规范的一部分,它用于标记一个方法,这个方法将在对象被Spring容器初始化完成后、所有依赖注入完成并且在该对象的`init()`方法之前调用。使用`@PostConstruct`注解的方法只会被调用一次,...
在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...
Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...
当Spring容器创建并初始化Bean时,会寻找带有@PostConstruct注解的方法并执行。 2. **InitializingBean接口** 如果一个Bean实现了Spring的InitializingBean接口,那么它必须重写`afterPropertiesSet()`方法。此...
在Spring框架中,静态实例化是指在应用程序启动时,即Spring容器初始化过程中创建Bean实例的过程。通常情况下,Spring会根据配置文件中的定义,在应用启动时自动创建和管理Bean实例。这种方式可以确保在应用运行期间...
一旦Spring容器初始化完毕,所有被扫描到的`@Component`注解的类的实例都会被创建并存放在容器中。我们可以使用`getBean()`方法从容器中获取这些对象。 ```java MessagePrinter printer = context.getBean...
4. 实现容器的初始化方法,加载Bean定义,并根据定义创建Bean实例。 5. 实现依赖注入,可以通过反射或者构造函数注入来完成。 6. 添加获取Bean实例的方法,模拟Spring容器的getBean功能。 在标签中提到了“源码”和...
本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...
在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、作用域等属性。这个阶段不涉及Bean的实际实例化,而是构建Bean的元数据。 2. **Bean实例化** 实例化是...
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
- **Bean**: Bean是由Spring容器初始化、装配及管理的对象,它们的定义及依赖关系由配置元数据描述。 - **Bean的定义**: Bean的定义通常包括类名、构造函数参数、依赖注入以及其他配置属性。 - **Bean的生命周期**: ...
4. **管理生命周期**: Spring容器能够管理Bean的生命周期,包括初始化、销毁等。在简单的实现中,可以添加方法来模拟这些生命周期回调。 5. **依赖注入**: 最后,通过反射调用setter方法或构造函数,将依赖注入到...