Spring进阶之路(2)-ApplicationContext容器以及事件机制

Spring容器最基本的接口是BeanFactory,他负责配置、创建、管理bean,他的子接口之一:ApplicationContext,也叫做spring的上下文。ApplicationContext是BeanFactory的子接口,在web应用中,通常会用到XmlWebApplicationContext、AnnotationCofigWebApplicationContext两个实现类。


ApplicationContext简介


系统创建ApplicationContext容器的时候,默认会预先初始化所有的单例的bean,调用构造器创建实例对象,然后通过set方法注入依赖的对象实例。这样的情况下,也就是说会面临着一个问题,容器在初始化的时候会有较大的性能的消耗,但是一旦初始化完成之后,程序在获取单例的bean的时候,又会获得较好的性能。


下面看一个简单的例子,来理解一下ApplicationContext的初始化流程。

创建如下的一个类。包括无参数的构造函数以及一个set方法。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.siti.spring20160228;  
  2.   
  3. public class WangYang {  
  4.   
  5.     public WangYang(){  
  6.         System.out.println("无参的构造函数!");  
  7.     }  
  8.       
  9.     public void setName(String name){  
  10.         System.out.println("my name is " + name);  
  11.     }  
  12. }  
配置文件中添加这个bean类。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="  
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  6.   
  7. <!-- bean definitions here -->  
  8.     <bean id = "wy" class = "com.siti.spring20160228.WangYang">  
  9.         <property name="name" value="wy"></property>  
  10.     </bean>  
  11. </beans>  

测试类,只创建一个ApplicationContext的实例对象。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.siti.spring20160228;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainTest {  
  7.   
  8.     public static void main(String[] args) {  
  9.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext20160228.xml");  
  10.     }  
  11. }  

测试结果:




ApplicationContext的事件机制


ApplicationContext的事件机制属于观察者设计模式(设计模式篇会在后期专门推出请读者关注),通过ApplicationEvent和ApplicationListener接口,可以实现ApplicationContext的事件处理。


spring事件机制中ApplicationEvent和ApplicationListener起到重要作用。其中,ApplicationEvent:由ApplicationContext发布。ApplicationListener可以由容器里面任何的监听器bean担任。




下面以一段实例进行讲解

MessageEvent类继承了ApplicationEvent类,一个事件。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.siti.spring20160228.applicationContextListener;  
  2.   
  3. import org.springframework.context.ApplicationEvent;  
  4.   
  5. public class MessageEvent extends ApplicationEvent {  
  6.     private static final long serialVersionUID = 1L;  
  7.   
  8.     private String messageContent;  
  9.       
  10.     public MessageEvent(Object source) {  
  11.         super(source);  
  12.     }  
  13.       
  14.     public MessageEvent(Object source, String messageContent) {  
  15.         super(source);  
  16.         this.messageContent = messageContent;  
  17.     }  
  18.   
  19.     public String getMessageContent() {  
  20.         return messageContent;  
  21.     }  
  22.   
  23.     public void setMessageContent(String messageContent) {  
  24.         this.messageContent = messageContent;  
  25.     }  
  26.       
  27.       
  28. }  


监听器类实现ApplicationListener接口实现需要实现的这个方法,发生事件的时候会被触发。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.siti.spring20160228.applicationContextListener;  
  2.   
  3. import org.springframework.context.ApplicationEvent;  
  4. import org.springframework.context.ApplicationListener;  
  5.   
  6. public class MessageListener implements ApplicationListener<ApplicationEvent> {  
  7.   
  8.     // 容器事件发生的时候触发方法的执行  
  9.     @Override  
  10.     public void onApplicationEvent(ApplicationEvent event) {  
  11.         if(event instanceof MessageEvent){  
  12.             MessageEvent messageEvent = (MessageEvent) event;  
  13.             System.out.println("信息内容是:" + messageEvent.getMessageContent());  
  14.         }else{  
  15.             System.out.println("其他的信息!" + event.toString());  
  16.         }  
  17.           
  18.     }  
  19.   
  20. }  

注册监听器,在spring的配置文件当中配置一下即可。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="  
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  6.   
  7. <!-- bean definitions here -->  
  8.       
  9.     <bean class = "com.siti.spring20160228.applicationContextListener.MessageListener"></bean>  
  10.       
  11. </beans>  

在测试程序中进行测试如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.siti.spring20160228.applicationContextListener;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainTest {  
  7.   
  8.     public static void main(String[] args) {  
  9.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext20160228.xml");  
  10.           
  11.         MessageEvent event = new MessageEvent("""my name is wy");  
  12.         // 发布事件  
  13.         context.publishEvent(event);  
  14.     }  
  15. }  

打印信息
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 其他的信息!org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@1dff3a2: startup date [Sun Feb 28 14:43:48 CST 2016]; root of context hierarchy]  
  2. 信息内容是:my name is wy  


打印的信息中我们看到,打印出来我们监听到的事件的同时,也监听到了内置的事件的消息。

spring的内置事件:

1. ContextRefreshedEvent:ApplicationContext容器初始化或者刷新的时候会触发这个事件。

2. ContextStartedEvent:当使用ConfigurableApplicationContext(applicationContext的子接口)接口的start方法启动ApplicationContext容器的时候触发这个事件。

3. ContextClosedEvent:当使用ConfigurableApplicationContext(applicationContext的子接口)接口的close方法启动ApplicationContext容器的时候触发这个事件。

4. ContextStoppedEvent:当使用ConfigurableApplicationContext(applicationContext的子接口)接口的stop方法启动ApplicationContext容器的时候触发这个事件。

5. RequestHandledEvent:web相关的事件,只能用在DispatcherServlet的web应用中,在使用spring作为mvc控制器的时候,处理完用户的请求后,系统会自动的调用。

另外webSocket服务中,还有,SessionConnectedEvent、SessionConnectEvent、SessionDisconnectEvent三个事件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值