Spring随笔之ApplicationContext
前言
以前自己学习和实习的时候多次用过spring框架。对于我这种菜鸟来说,Spring给我的第一印象是好学,太TM好学了(抱歉没忍住脏话),跟着开发组熟悉几天就可以开始写代码,自我感觉代码敲得飞起~(苦笑),随着学习的深入,才发现自己坐井观天,还有太多的东西要学。现在决定沉下心来好好的找找自己的短板,本系列文章不会系统的介绍Spring的知识。首先明确定位,本系列的博客是小白文,我也是个学习者,可能很多东西大家看了会觉so easy,但适合自己的对我来说就是最好的,也记录成长的一个过程。
说明,如果文章借鉴一些前辈们的辛苦成果,会在文章最后标明。如有侵权问题或者不满意的地方请留言,我会第一时间修改。
1 ApplicationContext
API介绍如下:
public interface ApplicationContext
extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver Central interface to provide configuration for an application. This is read-only while the application is running, but may be reloaded if the implementation supports this. An ApplicationContext provides: Bean factory methods for accessing application components. Inherited from ListableBeanFactory.
The ability to load file resources in a generic fashion. Inherited from the ResourceLoader interface.
The ability to publish events to registered listeners. Inherited from the ApplicationEventPublisher interface.
The ability to resolve messages, supporting internationalization. Inherited from the MessageSource interface.
Inheritance from a parent context. Definitions in a descendant context will always take priority. This means, for example, that a single parent context can be used by an entire web application, while each servlet has its own child context that is independent of that of any other servlet. In addition to standard BeanFactory lifecycle capabilities, ApplicationContext implementations detect and invoke ApplicationContextAware beans as well as ResourceLoaderAware, ApplicationEventPublisherAware and MessageSourceAware beans.
很好理解,ApplicationContext很重要,它为应用提供配置,当应用运行时他是可读的,但是可以被重新加载。
ApplicationContext接口继承了EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver等接口,这些接口让ApplicationContext具有如下功能:
(1)提供访问应用组件的bean工厂方法,该功能继承自ListableBeanFactory接口。
(2)提供通用的方式加载文件资源,该功能继承自ResourceLoader接口。
(3)将事件发布给注册的监听器。该功能继承自ApplicationEventPublisher接口。
(4)解决消息和支持国际化,该功能继承自MessageSource接口。
(5)从父上下文继承。子上下文中的定义总是优先考虑。例如,整个web应用有一个父上下文,而每个servlet都有自己独立的子上下文。
除了标准BeanFactory的能力,ApplicationContext还实现检测和调用ApplicationContextAware 、ResourceLoaderAware、ApplicationEventPublisherAware and MessageSourceAware。
上述就是简单的将官方API翻译了一遍~~ 仔细的读者可能脑海中,冒出了至少有两个问题。
问题1:上述功能第2条说ApplicationContext加载文件资源的功能继承自ResourceLoader,而该ApplicationContext接口在声明是并没有没有继承该接口,那么是怎么继承的?
答:仔细看ApplicationContext接口的声明,发现它继承了ResourcePatternResolver。跟进源码发现ResourcePatternResolver继承了ResourceLoader。所以说ResourceLoader和ApplicationContext是爷孙关系,并不是父子关系。
源码中的类注释是这样写的:
Strategy interface for resolving a location pattern (for example,an Ant-style path pattern) into Resource objects.
这是一个策略接口,这样做的目的是为了将一个 location模式解析到一个资源对象中,例如Ant风格的路径模式。(这里好像还是不理解,原谅我的菜~,不如先看看ResourceLoader接口回头再来理解。)
/**
* Strategy interface for loading resources (e.. class path or file system
* resources). An {@link org.springframework.context.ApplicationContext}
* is required to provide this functionality, plus extended
* {@link org.springframework.core.io.support.ResourcePatternResolver} support.
*
* <p>{@link DefaultResourceLoader} is a standalone implementation that is
* usable outside an ApplicationContext, also used by {@link ResourceEditor}.
*
* <p>Bean properties of type Resource and Resource array can be populated
* from Strings when running in an ApplicationContext, using the particular
* context's resource loading strategy.
*
* @author Juergen Hoeller
* @since 10.03.2004
* @see Resource
* @see org.springframework.core.io.support.ResourcePatternResolver
* @see org.springframework.context.ApplicationContext
* @see org.springframework.context.ResourceLoaderAware
*/
public interface ResourceLoader { /** Pseudo URL prefix for loading from the class path: "classpath:" */
String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX; /**
* Return a Resource handle for the specified resource location.
* <p>The handle should always be a reusable resource descriptor,
* allowing for multiple {@link Resource#getInputStream()} calls.
* <p><ul>
* <li>Must support fully qualified URLs, e.g. "file:C:/test.dat".
* <li>Must support classpath pseudo-URLs, e.g. "classpath:test.dat".
* <li>Should support relative file paths, e.g. "WEB-INF/test.dat".
* (This will be implementation-specific, typically provided by an
* ApplicationContext implementation.)
* </ul>
* <p>Note that a Resource handle does not imply an existing resource;
* you need to invoke {@link Resource#exists} to check for existence.
* @param location the resource location
* @return a corresponding Resource handle (never {@code null})
* @see #CLASSPATH_URL_PREFIX
* @see Resource#exists()
* @see Resource#getInputStream()
*/
Resource getResource(String location); /**
* Expose the ClassLoader used by this ResourceLoader.
* <p>Clients which need to access the ClassLoader directly can do so
* in a uniform manner with the ResourceLoader, rather than relying
* on the thread context ClassLoader.
* @return the ClassLoader
* @see org.springframework.util.ClassUtils#getDefaultClassLoader()
*/
@Nullable
ClassLoader getClassLoader(); }
一个静态常量CLASSPATH_URL_PREFIX = "classpath:"
两个成员方法getResource、getClassLoader
多余的这里我就不翻译了,相信大部分同学的英语水准都比四级都差点没过的我要强。
仔细看getResource(String location)返回值是Resource ,这又是个什么鬼?继续点进去看源码发现其声明如下:
public interface Resource extends InputStreamSource
基本上可以猜到封装了一个输入流,加一些包装的方法等。如果InputStream的原理不懂的,可以看一下java的InputStream源码。
尼玛~本章的内容我没记错的话好像是ApplicationContext,似乎是有点跑偏了,接下来回到问题1抛出的新问题(还是有点偏,大家先忍忍)。
为什需要一个ResourcePatternResolver,我们看看该接口的源码:
public interface ResourcePatternResolver extends ResourceLoader {
/**
* Pseudo URL prefix for all matching resources from the class path: "classpath*:"
* This differs from ResourceLoader's classpath URL prefix in that it
* retrieves all matching resources for a given name (e.g. "/beans.xml"),
* for example in the root of all deployed JAR files.
* @see org.springframework.core.io.ResourceLoader#CLASSPATH_URL_PREFIX
*/
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
/**
* Resolve the given location pattern into Resource objects.
* <p>Overlapping resource entries that point to the same physical
* resource should be avoided, as far as possible. The result should
* have set semantics.
* @param locationPattern the location pattern to resolve
* @return the corresponding Resource objects
* @throws IOException in case of I/O errors
*/
Resource[] getResources(String locationPattern) throws IOException;
}
里面有一个常量CLASSPATH_ALL_URL_PREFIX = "classpath*:"
回顾父接口常量CLASSPATH_URL_PREFIX = "classpath:"
发生了什么?多了一个“*”号!可能到这里很多读者已经想起来Ant-style path pattern的三个符号了
? 匹配任何单字符
* 匹配0或者任意数量的字符
** 匹配0或者更多的目录
getResources方法的返回值是个数组,到此恍然大悟,一个模式可能匹配多个文件。到此问题1算是解决了~
问题2:官方文档似乎没有介绍继承EnvironmentCapable, HierarchicalBeanFactory两个接口有什么用?
我们先看EnvironmentCapable源码:
public interface EnvironmentCapable {
/**
* Return the {@link Environment} associated with this component.
*/
Environment getEnvironment();
}
该接口表面上的作用是提供一个Environment的引用,这有什么用?
源码的类注释解释了,大概意思是:spring中所有context都继承了该接口,这样做的目的是用于类型检查,例如框架中有些与用户定义的BeanFactory交互的方法,这些方法有些就需要使用用户定义的BeanFactory的环境变量。这个时候就要看其是否是EnvironmentCapable接口的子类了。
注释还强调了ConfigurableApplicationContext重写了getEnvironment,其返回值是ConfigurableEnvironment。
ConfigurableApplicationContext又是哪来的,后面进入本章高潮了再介绍。
public interface HierarchicalBeanFactory extends BeanFactory {
/**
* Return the parent bean factory, or {@code null} if there is none.
*/
@Nullable
BeanFactory getParentBeanFactory();
/**
* Return whether the local bean factory contains a bean of the given name,
* ignoring beans defined in ancestor contexts.
* <p>This is an alternative to {@code containsBean}, ignoring a bean
* of the given name from an ancestor bean factory.
* @param name the name of the bean to query
* @return whether a bean with the given name is defined in the local factory
* @see BeanFactory#containsBean
*/
boolean containsLocalBean(String name);
}
HierarchicalBeanFactory也继承了BeanFactory,为什么是也?还记得ApplicationContext的功能1吗?因为ListableBeanFactory肯定继承了BeanFactory(不要问我为什么知道)
HierarchicalBeanFactory有两个方法:(1)得到父bean factory.(2)返回本地bean工厂是否包含给定名称的bean,忽略在祖先上下文中定义的bean。
留个思考题:为什么要这么设计?为什么??
到此,ApplicationContext继承的多个接口我们都知道其作用了,有几个API中解释了的接口还没深入源码,感兴趣的可以继续~~~
ApplicationContext继承了那么多功能,那么它自己有什么独特的呢?
aaarticlea/png;base64,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" alt="" />
其他方法都好理解,这里似乎有1个问题:这里为什么要暴露出AutowireCapableBeanFactory?搞明白该接口的作用解决该问题的希望可能会更大(这不废话么,哈哈)。
TODO:AutowireCapableBeanFactory
下面介绍ApplicationContext的层级关系

太多了,部分没展开。大家是否发现了自己熟悉的context,例如ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext等。
类图懒得画了,找了一个,如下(来自:http://blog.csdn.net/h12kjgj/article/details/53725507)

TODO:解读常用的context源码
下文是本文梳理的重点(来自:http://blog.csdn.net/h12kjgj/article/details/53725507)

Spring随笔之ApplicationContext的更多相关文章
- 【Spring】Spring随笔索引
Spring随笔索引 [Spring]Spring bean的实例化 [Spring]手写Spring MVC [Spring]Spring Data JPA
- spring BeanFactory及ApplicationContext中Bean的生命周期
spring bean 的生命周期 spring BeanFactory及ApplicationContext在读取配置文件后.实例化bean前后.设置bean的属性前后这些点都可以通过实现接口添加我 ...
- spring中获取applicationContext
常用的5种获取spring 中bean的方式总结: 方法一:在初始化时保存ApplicationContext对象代码:ApplicationContext ac = new FileSystemXm ...
- Spring的配置文件ApplicationContext.xml配置头文件解析
Spring的配置文件ApplicationContext.xml配置头文件解析 原创 2016年12月16日 14:22:43 标签: spring配置文件 5446 spring中的applica ...
- Spring基础04——ApplicationContext
1.ApplicationContext简述 ApplicationContext代表IOC容器,在SpringIOC容器中读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化后 ...
- 死磕Spring之IoC篇 - Spring 应用上下文 ApplicationContext
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Spring使用非applicationContext.xm 默认名的配置文件的配置
Spring默认的配置文件是applicationContext.xml,但是有些时候,希望拆分Spring的配置文件,让其单一化,每一个都只进行自己的配置,如图所示 那么就需要在web.xml中配置 ...
- Spring中的ApplicationContext事件机制
ApplicationContext的事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListerner接口来实现. 1. 创建EmailEvent pu ...
- spring获取webapplicationcontext,applicationcontext几种方法详解
法一:在初始化时保存ApplicationContext对象代码: ApplicationContext ac = new FileSystemXmlApplicationContext(" ...
随机推荐
- 用CSS模拟魔兽世界技能冷却的效果
效果演示 上面的效果看起来还不错吧.在网页里,除了用Flash,我们还是有不少方法可以实现它. 显然这种效果不复杂,一张背景图片,加上前面带有透明度的多边形图层,在脚本控制下就可以转起来了.但问题 ...
- 使用fdisk命令对linux硬盘进行操作
fdisk是linux自带的硬盘分区工具,可以对硬盘进行分区,或者对硬盘分区进行调整.本次试验环境请参考[Linux磁盘系统基础知识] 首先选择要进行操作的磁盘 [root@a ~]# fdisk / ...
- Spinner用法与ListView用法
参考: http://blog.csdn.net/u012960536/article/details/46732421 --------------------------------------- ...
- EVERYTHING 1.3.4参数
命令行参数 操作符: space 与 (AND) | 或 (OR) ! 非 (NOT) < > 分组 " &quo ...
- POCO库中文编程参考指南(6)Poco::Timestamp
1 类型别名 三个时间戳相关的类型别名,TimeDiff表示两个时间戳的差,第二个是以微秒为单位的时间戳,第三个是以 100 纳秒(0.1 微妙)为单位的时间戳: typedef Int64 Time ...
- ajax上传图片到数据库中(不会即时显示)
一共三个页面 数据表结构 数据表内容 第一个页面 nicheng.html <!DOCTYPE html> <html> <head> <meta chars ...
- commons-lang3中DateUtils类方法介绍
添加commons-lang3的Maven依赖 <dependency> <groupId>org.apache.commons</groupId> <art ...
- BigDecimal 使用 静态方法总结
转自:http://myrecord.top/?post=18 -------------千位加, public static String getQs(String old){ boolean re ...
- 【linux高级程序设计】(第十一章)System V进程间通信 3
信号量通信机制 可以看到,跟消息队列类似,也是包括两个结构. int semget (key_t __key, int __nsems, int __semflg) : 创建信号量集合 第一个参数:f ...
- Codeforces538F A Heap of Heaps(函数式线段树)
题意:给你一个数组a[n],对于数组每次建立一个完全k叉树,对于每个节点,如果父节点的值比这个节点的值大,那么就是一个违规点,统计出1~n-1完全叉树下的违规点的各自的个数. 一个直觉的思想就是暴力, ...