这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
ApplicationContext除了拥有 BeanFactory支持的所有功能之外,还进一步扩展了基本容器的功能。包括BeanFactoryPostProcessor、BeanPostProcessor以及其他特殊类型bean的自动识别、容器启动后bean实例的自动初始化、 国际化的信息支持、容器内事件发布等。
Spring为ApplicationContext提供了一些内部的默认实现:
- FileSystemXmlApplicationContext:文件系统中加载配置
- ClassPathXmlApplicationContext:classpath下加载配置
- XmlWebApplicationContext:用于Web应用程序
统一资源加载策略
java提供的java.net.URL只限于网络形式发布的资源的查找和定位工作,不能叫做统一资源定位器。并且资源的查找和资源的表示没有一个清晰的界限。所Spring提出了一套基于 org.springframework.core.io.Resource和 org.springframework.core.io.ResourceLoader接口的资源抽象和加载策略。
Spring中的Resource
- Resource接口作为所有资源的抽象和访问接口
- Resource接口可以根据资源的不同类型,或者资源所处的不同场合,给出相应的具体实现。这些实现类在org.springframework.core.io包下。
- 需要自定义,我们只需要自己实现Resource接口就行了
ResourceLoader,“更广义的URL”
查找和定位这些资源的统一抽象
ApplicationContext与ResourceLoader
ApplicationContext继承了ResourcePatternResolver,就间接实现了ResourceLoader接口。
所以任何的ApplicationContext实现都可以看作是一个 ResourceLoader甚至ResourcePatternResolver。而这就是ApplicationContext支持Spring内统一资源加载策略的真相。
国际化信息支持(I18n MessageSource)
应用程序需要支持它所面向的国家和地区的语言文字,为不同的国家和地区的用户提供他们各自的语言文字信息。这就要国际化支持。
Java SE提供的国际化支持
JavaSE国际化信息处理主要就是2个类:
- java.util.Locale
- 不同的Locale代表不同的国家和地区
- java.util.ResourceBundle。
- 保存特定于某个Locale的信息
MessageSource与ApplicationContext
Spring在Java SE的国际化支持的基础上,进一步抽象了国际化信息的访问接口,提供了org.springframework.context.MessageSource接口。
容器内部事件发布
Spring的ApplicationContext容器提供的容器内事件发布功能
自定义事件发布
Java SE提供了实现自定义事件发布功能的基础类:java.util.EventObject类和java.util.EventListener接口,我们可以通过扩展EventObject来实现,而事件的监听器则扩展自EventListener。
Spring的容器内事件发布类结构分析
Spring的ApplicationContext容器内部以 org.springframework.context.ApplicationEvent的形式发布事件。注册了ApplicationListener类型的Bean会被容器自动识别来监听ApplicationEvent类型的事件。
Spring容器内事件发布的应用
Spring的ApplicationContext容器内的事件发布机制,主要用于单一容器内的简单消息通知和处理,并不适合分布式、多进程、多容器之间的事件通知。
多配置模块加载的简化
主要就是ApplicationContext对有多个配置文件,加载很方便,只需要传入String[]数组就行了。
参考:
- 《Spring揭秘》