Spring-ApplicationContext的一些功能笔记

302 阅读3分钟

这是我参与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揭秘》