一、使用ApplicationContext

前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFactory的功能。

ApplicationContext允许以声明式方式操作容器,无须手动创建它。在Web应用启动时自动创建ApplicationContext。当然,也可以采用编程方式创建ApplicationContext。

除了提供BeanFactory所支持的全部功能外,ApplicationContext还有如下功能:

1、  ApplicationContext继承MessageSource接口,因此提供国际化支持。

2、  资源访问。

3、  事件机制。

4、  载入多个配置文件。

5、  以声明式的方式启动,并创建Spring容器。

当系统创建ApplicationContext容器时,默认会预初始化所有的singleton Bean。也就是说,当ApplicationContext容器初始化完成后,容器中所有singleton Bean也实例化完成,这就意味着:系统前期创建ApplicationContext时将有较大的系统开销,但一旦ApplicationContext初始化完成,程序后面获取singleton Bean实例时将拥有较好的性能。

二、ApplicationContext的国际化支持

ApplicationContext接口继承MessageSource接口,因此具备国际化功能。MessageSource接口中定义了三个方法用于国际化功能。

String getMessage(Stringcode,Object[] args,Locale loc);

StringgetMessage(String code,Object[] args,String default,Locale loc);

StringgetMessage(MessageSourceResolvable resolvable,Local loc);

ApplicationContext正是通过这三个方法来实现国际化的。当程序创建ApplicationContext容器时,Spring会自动查找在配置文件中名为messageSource的bean实例,一旦找到这个Bean实例,上述三个方法的调用被委托给该MessageSource Bean。如果没有该Bean,ApplicationContext会查找其父定义中的messagesource Bean,如果找到,它会作为messageSource Bean使用。但是如果无法找到messageSource,系统将会创建一个空的staticMessageSource Bean,该Bean的能接受上述三个方法的调用。

在Spring中配置messagesourceBean时通常使用ResourceBundleMessageSource.如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="messsageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basenames"><list><value>.....</value><value>.....</value><value>.....</value></list></property></bean>
</beans>

三、ApplicationContext的事件机制

ApplicationContext的事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext的事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布          ApplicationEvent时,ApplicationListenerBean就会自动触发。

Spring的事件框架有如下两个重要成员:

1、 ApplicationEvent:容器事件,必须由ApplicationContext发布。

2、 ApplicationListener:监听器,可由容器中的任何监听器Bean担任。

Spring的事件机制需要事件源、事件和事件监听器组成。只是此处的事件是ApplicationContext,且事件必须由java程序显示触发。下图简单示范了ApplicationContext的事件流程。

下面实例展示了Spring容器的事件机制。

1)、定义一个ApplicationEvent类,其对象就是Spring容器事件。

public class EmailEvent extends ApplicationEvent {private static final long serialVersionUID = 1L;private String address;private String text;// 定义一个带参的构造函数public EmailEvent(Object source) {super(source);}public EmailEvent(Object source, String address, String text) {super(source);this.address = address;this.text = text;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getText() {return text;}public void setText(String text) {this.text = text;}}

容器事件的监听器类必须实现ApplicationListener接口,它的实现方法如下:

onAPplicationEvent(ApplicationEventevent):每当容器内发生任何事件时,此方法都会被触发。

2)、编写该容器的监听器类。

public class EmailNotifier implements ApplicationListener{//该方法会在容器发生事件时触发public void onApplicationEvent(ApplicationEvent event) {if(event instanceof EmailEvent){//只处理EmailEvent,发送email通知EmailEvent emailEvent = (EmailEvent) event;System.out.println("需要发送邮件的接收地址为:"+emailEvent.getAddress());System.out.println("需要发送邮件的邮件正文是:"+emailEvent.getText());}else {//容器内置事件不作任何处理System.out.println("容器本身的事件:"+event);}}}

3)、将监听器类配置在容器中。

在为Spring容器注册监听器时,我们只需在Spring配置文件中配置一个实现了ApplicationListener的Bean即可,Spring容器会把这个Bean当做容器事件的监听器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- 配置监听器 --><bean class="com.app.listener.EmailNotifier"/></beans>

通过上面的3个步骤就可以实现Spring容器的事件了。当系统创建Spring容器,加载Spring容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。同时我们也可以调用ApplicationContext的pulishEvent()方法来主动触发容器事件。

public class SpringTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//创建一个ApplicationEvent对象EmailEvent emailEvent = new EmailEvent("hell","spring_test@163.com","this is a test");//主动触发容器事件ctx.publishEvent(emailEvent);}}

如果Bean想发布事件,则Bean必须获得其容器的引用。如果程序中没有直接获取容器的引用,则应该让Bean实现ApplicationContextAware或BeanFactoryAware接口,从而获得容器的引用。

除了我们可以自己实现Spring容器的事件外,Spring也提供了几个内置事件:

1、  ContextRefreshedEvent:ApplicationContext容器初始化或者刷新时触发该事件。

2、  ContextStartedEvent:当使用ConfigurableApplicationContext接口的start()方法启动ApplicationContext容器时触发该事件。

3、  ContextClosedEvent:当使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext容器时触发该事件。

4、  ContextStopedEvent: 当使用ConfigurableApplicationContext接口的stop()方法停止ApplicationContext容器时触发该事件。

读李刚《轻量级Java EE企业应用实战》

Spring读书笔记-----使用Spring容器(二)相关推荐

  1. Spring 读书笔记-----使用Spring容器(一)

    Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spr ...

  2. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  3. 读书笔记《Spring Boot+Vue全栈开发实战》(下)

    本书将带你全面了解Spring Boot基础与实践,带领读者一步步进入 Spring Boot 的世界. 前言 第九章 Spring Boot缓存 第十章 Spring Boot安全管理 第十一章 S ...

  4. (转) Spring读书笔记-----Spring的Bean之配置依赖

    前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念 ),现在介绍Spring Bean的基本配置. 从开始我们知道Ja ...

  5. (转)Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  6. 读书笔记《Spring Boot实战 —— Java EE 开发的颠覆者》

    Spring框架是轻量级的企业级开发一站式解决方案 Spring使用简单的POJO Plain Old Java Object 无限制的普通Java对象 Spring Framework Runtim ...

  7. Spring读书笔记-----Spring的Bean之Bean的基本概念

    从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  8. Spring学习笔记(三十二)——SpringBoot中cache缓存的介绍和使用

    目录 Spring Boot与缓存 什么是cache java cache:JSR107 Spring缓存抽象 redis和cache的使用场景和区别 SpringBoot缓存的使用 0. 开启缓存的 ...

  9. Spring学习笔记 之 Spring<全>

    开始学习Spring全家桶 文章目录 1. IoC 定义 为什么叫控制反转? 实现 IoC 容器创建 bean 的两种⽅式 IoC DI 特殊字符的处理 Spring 中的bean创建类型 -- sc ...

最新文章

  1. Python 之 pip拒绝访问
  2. springMVC 注解 controller层的优化
  3. 九度OJ 1011:最大连续子序列 (DP)
  4. 香港科技园公司“牵手”腾讯 共推香港金融科技发展
  5. 查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)
  6. html表格标签高级应用,asp.net core标签助手的高级用法TagHelper+Form
  7. FineReport报表和J2EE应用的集成
  8. [hackerrank]Manasa and Stones
  9. mysql安装数据自定义_mysql数据库自定义怎么安装
  10. 读书笔记_中国期货市场量化交易(李尉)03
  11. java redis jar_Java使用Redis
  12. oracle快速解析,教你用Oracle解析函数快速检查序列间隙
  13. rba有哪几個主要組成部分_RBA管理体系有哪些
  14. 计算机网络技术-Mooc
  15. 什么是TAO以及如何安装和使用TAO
  16. word里双横线怎么打_如何在word中画线 怎么在word中输入横线[图文]
  17. Matlab 2018a安装教程和破解方法(附Crack文件)
  18. python分拣豆子_〖小豆子〗还在为上网课记考勤而忧虑吗?自制python半自动打考勤程序来了!...
  19. 环境变量是什么?如何配置环境变量
  20. 使用jQuery实现返回顶部

热门文章

  1. 【API文档说明】获取商品详情和销量
  2. 双目结构光 实现高度测量
  3. Redis概述下载与安装使用redis
  4. 电容老化失效测试解决方案
  5. 经典算法之动态规划(零钱找零)
  6. 百度最近抽风了,快搜词典总是不收录
  7. Ericsson SDS
  8. android studio 简单二维码扫描识别代码
  9. IOS多线程系统学习之线程同步与线程通信
  10. 1106:年龄与疾病