`

Spring知识整理(五)—— ApplicationContext下

 
阅读更多

ApplicationContext相对于BeanFactory多了国际化和事件发布等新功能,下面就对这些新功能或是说支持做一个总结。

 

国际化

首先说下国际化信息支持(I18n MessageSource),I18Internationalization的缩写,因为这个但此很长并且有18个字母。在JavaSE中,我们使用LocaleResourceBundle类(请自行参考Java SDK)来实现国际化。Spring的一大原则就是不重新发明轮子,所以在JavaSE的基础上抽象出了一个MessageSource接口,这个接口里有只有三个getMessage方法,而参数除了上面提到的Locale外,还可能有信息的键(code)、参数数组(args)、找不到Message时默认信息(defaultMessage)和对资源条目的键以及信息参数等进行封装的MessageSourceResolvable对象。

 

Spring提供了三种MessageSource的实现:

StaticMessageSource:简单实现,多用于测试,不应该用于开发。

ResourceBundleMessageSource:。基于ResourceBundle实现,提供多个缓存来提高查询速度,对于参数化和非参数化信息的处理进行了优化,并对MessageFormat实例也进行了缓存,最常用的实现。

ReloadableResourceBundleMessageSource:相对于第二种实现,多了一个cacheSeconds属性用来指定时间段,以定期刷新并检查properties文件的变更。

 

ApplicationContext继承了MessageSource接口,但ApplicationContext会在容器中寻找一个名称为messageSourceMessageSource实现来完成国际化职责。如果找不到,ApplicationContext内部会默认实例化一个不含任何内容的StaticMessageSource实例,以

保证相应的方法调用。由于StaticMessageSource并不适合用于开发环境,所以通常情况下,要使用国际化功能,我们都会在Spring的配置文件中加入如下一个bean:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>messages</value>
            <value>errorcodes</value>
        </list>
    </property>
</bean>

 

这样我们就可以访问相应Locale对应的信息:

ApplicationContext ctx = ...;
String fileMenuName = ctx.getMessage("menu.file", new Object[]{"F"}, Locale.US);
String editMenuName = ctx.getMessage("menu.file", null, Locale.US); 

  

当然MessageSource的实现可以不需要依赖ApplicationContext而单独使用。同样的,Spring也提供了一个MessageSourceAware接口(一般不会使用,会造成容器的侵入性较强)。一般如果某些业务需要使用MessageSource的实现,一般的做法是将ApplicationContext中的messageSource注入到对应的bean中。

 

 

容器内部事件发布

首先也是要说一下javaSE中的事件发布,通过扩展指定的类和接口,包括EventObject(自定义事件类)类和EventListener(事件监听器)接口,我们就可以拥有自定义事件与对应的监听器。最后通过一个EventPublisher将事件发布。

 

ApplicationContext同样继承了ApplicationEventPublisher接口,也就是说,ApplicationContext就是一个事件发布者。在Spring中,事件全部扩展自ApplicationEvent抽象类(继承自EventObject),而监听器全部扩展自ApplicationListener接口(继承自EventListener)。ApplicationContext容器在启动时,会自动识别并加载EventListener类型bean,一旦容器内有事件发布,将通知这些注册到容器的EventListener

 

Spring提供了ApplicationEvent的三个实现类:

ContextClosedEvent:容器即将关闭时发布的事件。

ContextRefreshedEvent:容器在初始化或者刷新时发布的事件。

RequestHandledEventWeb请求处理后发布的事件,其子类ServletRequestHandledEvent提供Java EEServlet相关事件。

 

ApplicationContext的实现类在实现事件发布和事件监听器注册时,会把这些事转包给ApplicationEventMulticaster的接口。该接口定义了具体事件监听器的注册管理以及事件发布的方法。ApplicationEventMulticaster有一抽象实现类AbstractApplicationEventMulticaster,其实现类 SimpleApplicationEventMulticaster包含了事件发布功能的实现。SimpleApplicationEventMulticaster默认使用了SyncTaskExecutor进行事件的发布,这就使事件是同步顺序发布的。为了避免这种方式可能存在的性能问题,我们可以为其提供其他类型的TaskExecutor 实现类。(TaskExecutor以后说明)。

 

ApplicationContext容器在启动时,会检查容器内是否存在名为applicationEventMulticasterApplicationEventMulticaster对象实例,没有则默认初始化一个SimpleApplicationEventMulticaster作为将会使用的ApplicationEventMulticaster

 

事件发布的具体代码可以自己实现一下,其实就是事件继承ApplicationEvent,监听器实现ApplicationListenerEventPublisher中有一个ApplicationEventPublisher成员,在配置文件中将监听器和EventPublisher注册到ApplicationContext容器中即可。

 

 

分享到:
评论

相关推荐

    三、Spring源码分析——ApplicationContext

    《Spring源码分析——ApplicationContext》 在Java世界中,Spring框架是不可或缺的一部分,它以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性,极大地...

    Spring获取ApplicationContext对象工具类的实现方法

    在Spring中,ApplicationContext(应用程序上下文)是容器的核心,负责配置和管理应用中对象的生命周期和依赖关系。在实际开发过程中,经常需要从各个角落获取到这个ApplicationContext对象,以便于能够使用Spring...

    Spring MVC开发配置文件 applicationContext

    Spring Web MVC开发 xml配置文件格式,无bean之类 Spring Web MVC开发配置文件 applicationContext

    spring+jpa的applicationContext.xml配置

    spring+jpa的applicationContext.xml配置

    Spring中ApplicationContext和beanfactory区别.rar

    在Spring框架中,ApplicationContext和BeanFactory是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入学习和使用Spring至关重要。 首先,BeanFactory是Spring中最基础的bean管理容器,它...

    Spring中ApplicationContext加载机制

    Spring中ApplicationContext加载机制 ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...

    Spring————面试题库

    使用Spring框架能够为开发者带来许多好处,例如通过依赖注入(Dependency Injection, DI)方法,能够清晰地管理对象间的依赖关系,相比于EJB容器,Spring的IoC容器更为轻量级,更适合在有限的内存和CPU资源下进行...

    Spring 2.5-applicationContext.xml提示信息的配置

    在Spring框架中,`applicationContext.xml`是应用上下文的核心配置文件,用于定义bean的创建、依赖关系以及各种服务的配置。这篇博文“Spring 2.5 - applicationContext.xml提示信息的配置”主要探讨了如何在Spring ...

    spring3.0 + Quartz1.52 + applicationContext.xml

    1. **添加依赖**:在`lib`目录下,可能包含了Quartz库所需的JAR文件,例如`quartz.jar`、`spring-context-support.jar`等。这些依赖使得Spring能够识别并支持Quartz的配置。 2. **配置Scheduler**:在`...

    spring學習筆記——Helloworld

    在本篇“Spring学习笔记——HelloWorld”中,我们将探讨Spring框架的基础知识,以及如何创建一个简单的Spring应用程序。Spring是一个广泛使用的Java企业级应用开发框架,它提供了丰富的功能,包括依赖注入、AOP...

    spring4的所有jar包+applicationContext.xml+web.xml

    在“spring4的所有jar包+applicationContext.xml+web.xml”这个组合中,我们主要讨论以下几个关键知识点: 1. **Spring框架的jar包**:Spring框架由多个模块组成,每个模块都有相应的jar包。主要包括Spring Core、...

    spring 获得applicationcontext公用方法

    在Spring框架中,`ApplicationContext`是一个非常重要的接口,它提供了加载和管理Bean定义,以及获取Bean实例的功能。本文将深入探讨如何在Spring中获取`ApplicationContext`的公用方法,并结合提供的两个文件名`...

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...

    spring为ApplicationContext提供的3种实现分别为:ClassPathXmlApplicationContext

    标题提到的“ClassPathXmlApplicationContext”是 Spring 提供的三种 ApplicationContext 实现之一,主要用来加载类路径下的 XML 配置文件。 ApplicationContext 的主要功能包括: 1. **Bean的管理**:...

    spring知识点总结

    “知识点总结.xls”可能是一个整理好的Spring框架关键知识点的表格,可能包含了Spring的主要模块(如Core Container、Data Access/Integration、Web、AOP、Test等)、关键概念(如Bean、ApplicationContext、IoC容器...

    spring的Applicationcontext对事件的监听,实现类似MQ的效果

    在Spring框架中,`ApplicationContext`不仅是一个容器,用于管理Bean的生命周期和依赖注入,它还提供了事件发布和监听的功能。这个特性使得Spring应用能够实现组件间的异步通信,类似于消息队列(MQ)的工作模式。...

    spring2.5的applicationContext配置文件

    下面我们将详细探讨`applicationContext.xml`在Spring 2.5中的重要知识点。 1. **Bean的定义**:在`applicationContext.xml`中,我们通过`&lt;bean&gt;`标签来定义一个对象,如`...

    Spring配置文件ApplicationContext

    Spring配置文件ApplicationContext,内容齐全,有需要的可以下载。

Global site tag (gtag.js) - Google Analytics