监听器

作者: fd649cf896c0 | 来源:发表于2018-03-01 16:02 被阅读0次
/////////// ListenableProperties /////////////
/**
 * Properties 本质上是一个HashTable,每次读写都会加锁,所以不支持频繁的System.getProperty(name)来检查系统内容变化 因此扩展了一个ListenableProperties,
 * 在其所关心的属性变化时进行通知.
 * 
 * @see ListenableProperties
 */
public static synchronized void registerSystemPropertiesListener(PropertiesListener listener) {
    Properties currentProperties = System.getProperties();

    // 将System的properties实现替换为ListenableProperties
    if (!(currentProperties instanceof ListenableProperties)) {
        ListenableProperties newProperties = new ListenableProperties(currentProperties);
        System.setProperties(newProperties);
        currentProperties = newProperties;
    }

    ((ListenableProperties) currentProperties).register(listener);
}

/**
 * Properties 本质上是一个HashTable,每次读写都会加锁,所以不支持频繁的System.getProperty(name)来检查系统内容变化 因此扩展了Properties子类,
 * 在其所关心的属性变化时进行通知.
 * 
 * @see PropertiesListener
 */
public static class ListenableProperties extends Properties {

    private static final long serialVersionUID = -8282465702074684324L;

    protected transient List<PropertiesListener> listeners = new CopyOnWriteArrayList<PropertiesListener>();

    public ListenableProperties(Properties properties) {
        super(properties);
    }

    public void register(PropertiesListener listener) {
        listeners.add(listener);
    }

    @Override
    public synchronized Object setProperty(String key, String value) {
        Object result = put(key, value);
        for (PropertiesListener listener : listeners) {
            if (listener.propertyName.equals(key)) {
                listener.onChange(key, value);
            }
        }
        return result;
    }
}

/**
 * 获取所关心的Property变更的Listener基类.
 */
public abstract static class PropertiesListener {

    // 关心的Property
    protected String propertyName;

    public PropertiesListener(String propertyName) {
        this.propertyName = propertyName;
    }

    public abstract void onChange(String propertyName, String value);
}




public void listenableProperties() {
    String name = "ss.test" + RandomUtil.nextInt();

    TestPropertiesListener listener = new TestPropertiesListener(name);
    SystemPropertiesUtil.registerSystemPropertiesListener(listener);

    System.setProperty(name, "haha");

    assertThat(listener.newValue).isEqualTo("haha");
}

public static class TestPropertiesListener extends PropertiesListener {

    public TestPropertiesListener(String propertyName) {
        super(propertyName);
    }

    public String newValue;

    @Override
    public void onChange(String propertyName, String value) {
        newValue = value;
    }

};

相关文章

  • SpringBoot--监听器解析

    监听器模式 监听器模式有要素 事件 监听器 广播器 触发机制 系统监听器 监听器 ApplicationListe...

  • 监听器

    一、监听器定义 现实生活 -web监听器 二、web监听器应用 三、创建监听器 1、创建一个实现监听器接口的类。 ...

  • JavaWeb - Listener

    监听器 实现一个监听器的接口. 编写一个监听器实现监听器的接口 web.xml 中注册监听器 看情况是否使用

  • Spring 监听器listener原理-基本使用(一)

    Spring 监听器listener原理-基本使用(一) Spring 监听器listener原理-手写监听器(二...

  • JavaEE_day23_Listener(监听器)

    一、监听器(Listener): 1.什么是监听器? 监听器就是监听某个对象的的状态变化的组件 监听器的相关概念:...

  • tomcat内存马Listener篇

    什么是监听器 监听器类型 java共有三种类型的监听器 ServletContext对象的监听器 它能够监听 Se...

  • 监听器

    一.监听器定义 二.web监听器的用途 三.创建监听器 创建一个实现监听器接口类( 实现的是ServletCont...

  • Bukkit插件开发教程 - 监听器

    监听器 - Listener 学习目标 理解监听器的意义 了解监听器的注册 @EventHandler注解的作用 ...

  • 2019-02-26 web监听器(慕课网学习笔记)

    1 监听器的定义 2 web中监听器的定义 3 web监听器的常用用途 4 创建第一个监听器 常规的web项目,需...

  • 23. 监听器

    12 监听器 实现一个监听器的接口 编写一个监听器package com.karl.listener;import...

网友评论

      本文标题:监听器

      本文链接:https://www.haomeiwen.com/subject/qhzgxftx.html