ApplicationContext--容器的功能扩展

Posted jazon@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ApplicationContext--容器的功能扩展相关的知识,希望对你有一定的参考价值。

ApplicationContext和BeanFactory两者都是用于加载Bean的,但是相比之下,ApplicationContext提供了更多的扩展功能。

prepareRefresh–环境准备

1.initPropertySources留给子类重写,可以初始化PropertySource
2.validateRequiredProperties则是对属性进行验证

obtainFreshBeanFactory–加载BeanFactory

protected final void refreshBeanFactory() throws BeansException 
    if (hasBeanFactory()) 
        destroyBeans();
        closeBeanFactory();
    
    try 
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        beanFactory.setSerializationId(getId());
        // 定制BeanFactory
        customizeBeanFactory(beanFactory);
        // 加载beandefinition
        loadBeanDefinitions(beanFactory);
        this.beanFactory = beanFactory;
    
    catch (IOException ex) 
        throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
    

定制BeanFactory

1.设置是否允许覆盖同名称不同定义的对象
2.提供了注解@Qualifier@Autowired的支持

加载BeanDefinition

1.将beandefinition加载入beanfactory中

prepareBeanFactory–功能扩展

增加SpEl语言的支持

1.为beanFactory设置BeanExpressionResolver,这个解析器何时用到呢?在bean进行属性填充的applyPropertyValues会用到, evaluateBeanDefinitinoString

增加属性注册编辑器

beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

在注入时,有时候需要注入Date,File。而配置是String,这时候就需要用到属性注册编辑器了。此处Spring加了一些内置的属性注册编辑器。

添加ApplicationContextAwareProcesscor处理器

之前我们已经提到过,BeanPostProcessor会在bean填充完属性后被调用。 看一下这个BeanPostProcessor源码就知道,它是在调用aware接口的bean。

设置忽略依赖

忽略掉Aware的依赖注入

注册依赖

beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);

通过上面的注册后,当你的类需要BeanFactory.class时,自然会能够给你注入

BeanFactory的后处理

激活注册的BeanFactoryPostProcessor

会调用BeanFactoryPostProcessor的postProcessBeanFactory方法

注册BeanPostProcessor

初始化消息资源

初始化ApplicationEventMulticaster

注册监听器

初始化非延迟加载单例

1.ConversionService的设置

2.冻结配置

3.初始化非延迟加载

即遍历调用getBean

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);
	

1.initLifecycleProcessor

初始化LifecycleProcessor

2.onRefresh

启动所有实现了Lifecycle接口的bean

3.publishEvent

发布ContextRefreshedEvent事件

以上是关于ApplicationContext--容器的功能扩展的主要内容,如果未能解决你的问题,请参考以下文章

ApplicationContext--容器的功能扩展

Spring 学习笔记——IoC容器(ApplicationContext)

Spring08-----IoC容器ApplicationContext

applicationContext & BeanFactory区别

Spring 源码学习~12容器的拓展功能简介

Spring 源码学习~12容器的拓展功能简介