没有合适的资源?快使用搜索试试~ 我知道了~
ApplicationContext容器的uml类图
需积分: 3 0 下载量 43 浏览量
2024-04-13
12:42:25
上传
评论
收藏 477KB DOCX 举报
温馨提示
试读
30页
ApplicationContext容器的uml类图
资源推荐
资源详情
资源评论
ApplicationContext 容器
1. 概述
ApplicationContext 接口代表了一个 Spring 容器,它主要负责实例化、配置和组装 bean。
ApplicationContext 接口间接继承了 BeanFactory 接口,相较于 BeanFactory 一些基本的容器
功能,ApplicationContext 接口是在 BeanFactory 接口基础上进行了扩展,增加了国际化、事
件广播、获取资源等一些新的功能。
2. ApplicationContext 系列类图
<<interface>>
ApplicationContext
EnvironmentCapable
ListableBeanFactory
HierarchicalBeanFactory
MessageSource
ApplicationEventPublisher
ResourcePatternResolver
<<interface>>
ConfigurableApplicationContext
AbstractApplicationContext
AbstractRefreshableApplicationCon text
AbstractRefreshableConfigApplicat ionContext
AbstractXmlApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
GenericApplicationContext
AnnotationConfigApplicationContext
ServletWebServerApplicationContext
AnnotationConfigServletWebServerApp licationContext XmlServletWebServerApplicationConte xt
<<interface>>
ReactiveWebApplicationContext
<<interface>>
ConfigurableReactiveWebApplicationC ontext
GenericReactiveWebApplicationContex t
ReactiveWebServerApplicationContext
AnnotationConfigReactiveWebServerAp plicationContext
GenericWebApplicationContext
<<interface>>
WebServerApplicationContext
<<interface>>
ConfigurableWebServerApplicationCon text
AnnotationConfigReactiveWebApplicat ionContext
BeanNameAware InitializingBean
GenericGroovyApplicationContext
GenericXmlApplicationContext
ResourceAdapterApplicationContext
StaticApplicationContext
AbstractRefreshableWebApplicationCo ntext
XmlWebApplicationContext
<<interface>>
WebApplicationContext
ThemeSource
AnnotationConfigWebApplicationConte xtGroovyWebApplicationContext
从以上类图中可以看出,ApplicationContext 接口的派生体系,是一个非常庞大的家族。
➢ FileSystemXmlApplicationContext : 默 认 从 文 件 系 统 中 加 载 bean 定 义 信 息 的
ApplicationContext 实现。
➢ ClassPathXmlApplicationContext : 默 认 从 ClassPath 中 加 载 bean 定 义 信 息 的
ApplicationContext 实现。
➢ XmlWebApplicationContext:专门用于 Web 应用程序的 ApplicationContext 实现。
SpringMVC 中默认使用的容器。
➢ AnnotationConfigApplicationContext:是一个基于注解配置类的 ApplicationContext 实
现。SpringBoot 中默认使用的容器。
➢ AnnotationConfigServletWebServerApplicationContext:是 SpringBoot 一个基于注解配
置类的 servlet web 应用程序的 ApplicationContext 实现。容器中会一个内置的 servlet
服务器。
➢ AnnotationConfigReactiveWebServerApplicationContext:是 SpringBoot 一个基于基于
注解配置类的 reactive web 应用程序的 ApplicationContext 实现。容器中会一个内置
的 reactive 服务器。
3. refresh()方法
3.1 概述
refresh 方法是 Spring 容器中一个非常核心的方法。经过 refresh 方法后,一个完整的 Ioc
容器已经创建完成。refresh 方法是在 ConfigurableApplicationContext 接口定义的,而给出具
体这个方法实现的是在 AbstractApplicationContext 的类中。
从 refresh 方法的源码可以发现,refresh 方法中调用了 12 个子方法。这 12 个子方法其
实就是 Spring 创建 Ioc 容器的 12 个步骤。
refresh 方法其实是使用了
模版方法模式。模板方法模式
定义一个操作中算法的框架,
而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变一个算法结构的情况下,
重定义该算法的某些特定步骤。
refresh 方法中调用的 12 个步骤方法,为 Ioc 容器的创建定义了一个总体框架。在各种
具体的 ApplicationContext 的子类中,会根据自身具体的特性,再对这 12 个步骤方法进行重
写,但是创建容器的总体步骤是不变的。
3.2 源码
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
//准备刷新上下文环境:设置其启动日期和活动标志,初始化上下文环境中的占位符
属性源
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
//实例化 DefaultListableBeanFactory 实例并返回,对 BeanFactory 进行定制,加载
BeanDefinition 的信息
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
//配置 beanFactory 容器的特性
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
//在容器初始化后,预留在子类中的上下文中,可以对容器进行修改
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
// 执行注册在容器中的各种 BeanFactory 的处理器
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
//注册 Bean 的各种处理器。处理器会在创建 bean 时调用。
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
//初始化上下文的 Message 源。如:i18n 国际化处理
initMessageSource();
// Initialize event multicaster for this context.
//为上下文初始化应用程序广播器
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
//在特定的上下文中,留给子类来的初始化其他的特殊 bean
onRefresh();
// Check for listener beans and register them.
// 查看 ApplicationListener 类型的 bean,并注册他们。
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
// 对上下文环境中剩余的单例 bean 完成初始化(非惰性的 bean)
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
// 调用 LifecycleProcessor 生命周期处理器的 onRefresh 方法并发布
ContextRefreshedEvent 通知,
// 来完成上下文的刷新过程。
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
//销毁上下文容器中所有缓存的单例 bean,已避免占用资源。
destroyBeans();
// Reset 'active' flag.
//取消此上下文的刷新尝试,并重置 active 标志。
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
3.2.1 prepareRefresh
prepareRefresh 方法主要是对上下文的刷新做了一些准备工作,该方法中主要做了以
下几件事情。
1. 激活开关
prepareRefresh 方法的激活开关,主要是程序中记录了当前的时间戳,打开了当
前上下文是否处于活动状态的标志(设置为 true) ,关闭当前上下文是否处于关闭
状态的标志(设置为 false)。
2. 初始化占位符
initPropertySources 方法是用于初始化上下文环境中的占位符属性。但是在
AbstractApplicationContext 类中,initPropertySources 方法只是一个空方法,
没有任何实现代码。该方法是专门预留给子类扩展实现用的。
我们可以自己实现一个继承至 AbstractApplicationContext 的子类,并在子类的
initPropertySources 方法中,根据自己的需求来设置需要验证的占位符。
3. 对占位符属性进行验证
Spring 对占位符属性进行验证时,先获取 ConfigurableEnvironment 类型的实例,
然后再调用这个实例的 validateRequiredProperties 方法来进行验证。
在 validateRequiredProperties 方法中,会判断占位符的属性值是否为空,若值
为空,就会抛出异常。默认情况下,一般是对系统中的环境变量和 JVM 的环境变量
来进行判断。
3.2.2 obtainFreshBeanFactory
obtainFreshBeanFactory 方法从方法名上,顾名思义就是获取 BeanFactory 容器。
Spring 经过这个函数之后,ApplicationContext 就已经拥有了 BeanFactory 的全部功能。
obtainFreshBeanFactory 方 法 很 简 单 , 它 主 要 调 用 了 两 个 方 法 , 这 两 个 方 法 分 别 是
refreshBeanFactory 和 getBeanFactory 方法。
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//创建 BeanFactory 容器实例
refreshBeanFactory();
//返回创建的 BeanFactory 容器实例
return getBeanFactory();
}
refreshBeanFactory 方法
refreshBeanFactory 方 法 的 作 用 主 要 是 创 建 BeanFactory 容 器 的 实 例 。
refreshBeanFactory 方法在 AbstractApplicationContext 类中只是一个虚方法,没有给出
具体的实现。这个方法的具体实现是在子类 AbstractRefreshableApplicationContext 类中
给出的。具体源码如下所示:
protected final void refreshBeanFactory() throws BeansException {
//判断是否已经创建了 BeanFactory 容器
//如果已经创建,则销毁容器中的 bean,并关闭容器
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
//使用 new 方式创建一个 DefaultListableBeanFactory 的容器
DefaultListableBeanFactory beanFactory = createBeanFactory();
//给容器设置一个序列化的 id
beanFactory.setSerializationId(getId());
//自定义 DefaultListableBeanFactory 容器的相关属性
customizeBeanFactory(beanFactory);
//给容器加载 BeanDefinition
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " +
getDisplayName(), ex);
}
}
通过以上源码可以发现 refreshBeanFactory 方法主要做了以下几件事情:
1. 创建 DefaultListableBeanFactory 容器
对于 DefaultListableBeanFactory 容器的创建, Spring 中直接是 new 的方式创建了一
个 DefaultListableBeanFactory 的实例,非常简单。DefaultListableBeanFactory 是
Bean 工厂的一个默认实现,它提供了容器的基本功能。
2. 给容器指定一个序列化的 id
3. 自定义容器的相关属性
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
if (this.allowBeanDefinitionOverriding != null) {
beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
剩余29页未读,继续阅读
资源评论
yaoxtao
- 粉丝: 183
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功