Java 监听器

一、监听器简介

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
监听器可以用来检测网站的在线人数,统计网站的访问量等等!

二、监听器组件

监听器涉及三个组件:事件源,事件对象,事件监听器

当事件源发生某个动作的时候,它会调用事件监听器的方法,并在调用事件监听器方法的时候把事件对象传递进去。

我们在监听器中就可以通过事件对象获取得到事件源,从而对事件源进行操作!

二、模拟监听器

1.监听器

监听器定义为接口,监听的方法需要事件对象传递进来,从而在监听器上通过事件对象获取得到事件源,对事件源进行修改!

/**
 * 事件监听器
 *
 * 监听Person事件源的eat和sleep方法
 */
interface PersonListener{

    void doEat(Event event);
    void doSleep(Event event);
}
2.事件源

事件源是一个Person类,它有eat和sleep()方法。
事件源需要注册监听器(即在事件源上关联监听器对象)
如果触发了eat或sleep()方法的时候,会调用监听器的方法,并将事件对象传递进去

/**
 *
 * 事件源Person
 *
 * 事件源要提供方法注册监听器(即在事件源上关联监听器对象)
 */

class Person {

    //在成员变量定义一个监听器对象
    private PersonListener personListener ;

    //在事件源中定义两个方法
    public void Eat() {

        //当事件源调用了Eat方法时,应该触发监听器的方法,调用监听器的方法并把事件对象传递进去
        personListener.doEat(new Event(this));
    }

    public void sleep() {

        //当事件源调用了Eat方法时,应该触发监听器的方法,调用监听器的方法并把事件对象传递进去
        personListener.doSleep(new Event(this));
    }

    //注册监听器,该类没有监听器对象啊,那么就传递进来吧。
    public void registerLister(PersonListener personListener) {
        this.personListener = personListener;
    }

}
3.事件对象

事件对象封装了事件源。
监听器可以从事件对象上获取得到事件源的对象(信息)

/**
 * 事件对象Even
 *
 * 事件对象封装了事件源
 *
 * 在监听器上能够通过事件对象获取得到事件源
 *
 *
 */
class Event{
    private Person person;

    public Event() {
    }

    public Event(Person person) {
        this.person = person;
    }

    public Person getResource() {
        return person;
    }

}

测试:

public static void main(String[] args) {

    Person person = new Person();

    //注册监听器()
    person.registerLister(new PersonListener() {
        @Override
        public void doEat(Event event) {
            Person person1 = event.getResource();
            System.out.println(person1 + "正在吃饭呢!");
        }

        @Override
        public void doSleep(Event event) {
            Person person1 = event.getResource();
            System.out.println(person1 + "正在睡觉呢!");
        }
    });


    //当调用eat方法时,触发事件,将事件对象传递给监听器,最后监听器获得事件源,对事件源进行操作
    person.Eat();
}
  • 事件源:拥有事件
  • 监听器:监听事件源所拥有的事件(带事件对象参数的)
  • 事件对象:事件对象封装了事件源对象

事件源要与监听器有关系,就得注册监听器【提供方法得到监听器对象】
触发事件源的事件,实际会提交给监听器对象处理,并且把事件对象传递过去给监听器。

三、Servle监听器

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别ServletContext, HttpSession和ServletRequest这三个域对象

和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用<listener>标签配置好监听器。

1.监听对象的创建和销毁

HttpSessionListener、ServletContextListener、ServletRequestListener分别监控着Session、Context、Request对象的创建和销毁

  • HttpSessionListener(可以用来收集在线者信息)
  • ServletContextListener(可以获取web.xml里面的参数配置)
  • ServletRequestListener
public class Listener1 implements ServletContextListener,
        HttpSessionListener, ServletRequestListener {

    // Public constructor is required by servlet spec
    public Listener1() {
    }

    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("容器创建了");
    }

    public void contextDestroyed(ServletContextEvent sce) {

        System.out.println("容器销毁了");
    }


    public void sessionCreated(HttpSessionEvent se) {

        System.out.println("Session创建了");
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Session销毁了");
    }


    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {

    }
}
  • 监听器监听到ServletContext的初始化了,Session的创建和ServletContext的销毁。(服务器停掉,不代表Session就被销毁了。Session的创建是在内存中的,所以没看到Session被销毁了)

四、SpringBoot中监听器的使用例子

private static final Map<String, UserSync> USER_SYNC_MAP = new HashMap<>();

  @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        LOGGER.info("监听到spring启动成功,初始化对接接口中");
        ApplicationContext context = event.getApplicationContext();
        //初始化同步接口
        Map<String, UserSync> userSyncMap = context.getBeansOfType(UserSync.class);
        for (UserSync userSync : userSyncMap.values()) {
            LOGGER.info("初始化《"+userSync.getSyncSystemCode()+"》系统接口成功...");
            USER_SYNC_MAP.put(userSync.getSyncSystemCode().toLowerCase(), userSync);
        }
        LOGGER.info("对接接口初始化完毕");
    }
public interface UserSync {

    /**
     * 是否拥有当前用户
     * @param jobNumber
     * @return
     */
    Boolean haveUser(String jobNumber);

    /**
     * 获取对接的系统ID
     * @return
     */
    String getSyncSystemCode();
}
@Component
public class DcUserSyncImpl implements UserSync {

    public static final Logger LOGGER = LoggerFactory.getLogger(DcUserSyncImpl.class);
    @Autowired
    private PersonRepository personRepository;

    @Override
    public Boolean haveUser(String jobNumber) {
        Person person = personRepository.findFirstByJobNumber(jobNumber);
        if(person==null||person.getOpendc()==null){
            return false;
        }
        return person.getOpendc();
    }

    @Override
    public String getSyncSystemCode() {
        return "dataCenter";
    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 老九军投稿专栏 时隔一天··· 两天··· 哎反正好多天了, 又有小伙伴来投稿啦! 今天的投稿来自老九线上训练营小...
    老九君阅读 408评论 1 0
  • 本文包括:1、Listener简介2、Servlet监听器3、监听三个域对象创建和销毁的事件监听器4、监听三个域对...
    廖少少阅读 5,983评论 6 28
  • 监听器用于监听Web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当监听范围的...
    nnngu阅读 9,651评论 1 1
  • 1.概念 监听器:主要用来监听对象的创建,属性的变化的。是一个特定接口的普通java类。对象:自己创建自己用(不用...
    廖马儿阅读 519评论 0 1
  • 参考文章:https://www.cnblogs.com/xdp-gacl/p/3969249.html 1. 概...
    Tian_Peng阅读 424评论 0 0