当前位置: 首页 > 编程笔记 >

Spring 实现自定义监听器案例

华宇
2023-03-14
本文向大家介绍Spring 实现自定义监听器案例,包括了Spring 实现自定义监听器案例的使用技巧和注意事项,需要的朋友参考一下

应用场景:

在一般的javaWeb项目中经常有一些缓存是需要再项目启动的时候加载到内存中,这样就可以使用自定义的监听器来实现。

1、在web.xml中声明

<!-- 自定义监听 启动加载系统参数 -->
 <listener>
 <listener-class>com.cn.framework.constant.OmsConfigLoader</listener-class>
</listener> 

2、创建类OmsConfigLoader 实现接口 ServletContextListener,项目启动的时候service还没有注入,此时调用service的方法会报错,因为在web容器中无论是servlet还是Filter都不是Spring容器来管理的。

listener的生命周期是web容器维护的,bean的生命周期是由Spring容器来维护的,所以在listener中使用@Resource,listener不认识,

可以沟通过如下方法来解决:

使用WebApplicationContextUtils工具类,该工具类的作用是获取到spring容器的引用,进而获取到我们需要的bean实例。

package com.cn.framework.constant;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.log4j.Logger;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.kxs.service.systemService.ISystemService;
public class OmsConfigLoader implements ServletContextListener {
private static Logger LOG = Logger.getLogger(OmsConfigLoader.class);
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
LOG.info("==> 加载OMS系统配置信息 Start ==");
try {
ISystemService iSystemService = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext())
.getBean(ISystemService.class);
iSystemService.refreshCache();
} catch (Exception e) {
e.printStackTrace();
LOG.info(e.toString());
}
LOG.info("==> 加载OMS系统配置信息 End ==");
}
}

补充:Spring-xml配置自定义事件监听器

一、自定义事件

Spring中使用自定义事件类型:

第一步:自定义事件类型:自定义类需要继承Spring中org.springframework.context.ApplicationEvent类

第二步:设置事件监听器,实现org.springframework.context.ApplicationListener<自定义事件类型>接口,重写onApplicationEvent方法监听事件源

第三步:将事件监听器配置到Spring中,通过xml配置文件将事件监听器配置到bean容器中

第四步:Spring容器(container容器发布事件)发布事件

自定义事件类型

public class RainEvent extends ApplicationEvent {
 private static final long serialVersionUID = 1L;
 public RainEvent(Object source) {
 super(source);
 } 
}

监听器:可以创建多个监听器

public class RainEventListener1 implements ApplicationListener<RainEvent> {
 //监听rainevent事件,调用当前方法
 @Override
 public void onApplicationEvent(RainEvent event) {
 Object source = event.getSource();
 System.out.println("监听器1:"+source); 
 }
}
public class RainEventListener2 implements ApplicationListener<RainEvent> {
 //监听rainevent事件,调用当前方法
 @Override
 public void onApplicationEvent(RainEvent event) {
 Object source = event.getSource();
 System.out.println("监听器2:"+source); 
 }
}

xml配置文件将监听器配置到bean容器中

<!-- 配置监听器,向spring容器发布事件,自动触发监听器的onApplicationEvent方法 -->
<bean class="com.briup.ioc.event.RainEventListener1"></bean>
<bean class="com.briup.ioc.event.RainEventListener2"></bean>

bean容器发布事件

public void ioc_event() {
 try {
  String path = "com/briup/ioc/event/event.xml";
  ApplicationContext container = 
    new ClassPathXmlApplicationContext(path);
    
  container.publishEvent(new RainEvent("打雷了,下雨了!"));
 } catch (Exception e) {
  e.printStackTrace();
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。

 类似资料:
  • 本文向大家介绍C#自定义事件监听实现方法,包括了C#自定义事件监听实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#自定义事件监听实现方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我想知道是否有人可以帮助我理解如何准确地创建不同的自定义事件侦听器。 我没有事件的具体案例,但我想大致了解它是如何完成的,因此可以将其应用于需要的地方。 我想做的是,以防万一有些人可能需要知道的是: 问题答案: var evt = document.createEvent(“Event”); evt.initEvent(“myEvent”,true,true);

  • 问题内容: 我想创建自己的Button类,该类将具有Sprite,并且每当我触摸它时,它将成长或旋转,等等,该类还将具有Draw和Update函数。 要检查我是否触摸它,我可以检查子画面矩形是否包含屏幕类的touchdown和touchup方法中触摸的位置。 我不想这样做,我想做一些类似android button click listener的事情,这可能吗? 就像是 有可能吗 问题答案: 当然

  • 问题内容: 假设我想为自己的班级创建自己的事件监听器,该怎么做?我需要手动维护线程吗? 问题答案: 创建一个将由您的活动实现的接口: 现在,您需要知道事件实际发生的时间。例如,当用户触摸屏幕上的一个点时,重写onTouchEvent方法: 同样,您可以创建所需的特定事件。(示例可能是按下,等待2秒钟然后松开-您需要在touch事件中执行一些逻辑操作)。 在您的活动中,可以使用customView对

  • 本文向大家介绍JAVA用户自定义事件监听实例代码,包括了JAVA用户自定义事件监听实例代码的使用技巧和注意事项,需要的朋友参考一下 JAVA用户自定义事件监听实例代码 很多介绍用户自定义事件都没有例子,或是例子不全,下面写了一个完整的例子,并写入了注释以便参考,完整的实例源代码如下: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 问题内容: 我做了一个自定义的Hibernate Event监听器,扩展了org.hibernate.event.PreInsertEventListener。自定义侦听器会覆盖onPreInsert方法并设置“联系人”实体的字段,然后再使用DAO将其保存在数据库中。 问题是,在侦听器为其提供值之前该字段为null,并且默认的hibernate事件侦听器在我的自定义侦听器之前自动触发。当他们检查d