java 事件监听

事件监听实现:

 三要素:

1、事件源(数据源,要处理的数据)

2、事件 (承载数据,传递信息并被监听)

3、监听器 (负责对数据的业务处理)

--该开发用例采用了Spring的事件监听

1、  定义事件类型

public class MyEvent extends ApplicationEvent {

    private static final long serialVersionUID = 7937618461275424515L;

    // 其他属性 (非必须)

    ... ...

    public MyEvent(Object source) {

        super(source);

    }

}

 

2、定义一个基础监听抽象类(一般处理一些公共的事情,非必须,推荐使用抽象类)

public abstract class BaseApplicationListener implements ApplicationListener {

   

    private static Logger logger = Logger.getLogger(BaseApplicationListener.class);

    // 此抽象方法,需要实现类对监听到的事件的具体业务处理

    public abstract String process(ApplicationEvent event);

 

    public final void onApplicationEvent(ApplicationEvent event) {

       String message = process(event);

   // 记录日志

   logger.info(message);

       // 其他处理

       ... ...

    }

   

}

 

3、定义具体实现类

public class MyListener extends BaseApplicationListener {

   

    @SuppressWarnings("unchecked")

    public String process(ApplicationEvent event) { // 实现对监听到的事件的具体业务处理

        String message = "";

        // 处理事件

        if(event!=null){

           // 判断事件类型

            if(event instanceof MyEvent){

                // 一些具体业务处理

               ... ...

            }

        }

        return message;

    }

}

 

其他service中需要发布事件方法代码:

 // data 就是要处理的业务数据对象

ContextUtil.getApplicationContext().publishEvent(new MyEvent(data));

 

工具类:

public class ContextUtil implements ApplicationContextAware {

   

    private ContextUtil() {

        //nothing

    }

 

    private static ApplicationContext applicationContext; // Spring应用上下文环境

 

    /**

     * 实现ApplicationContextAware接口的回调方法,设置上下文环境

     *

     * @param applicationContext

     * @throws BeansException

     */

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        ContextUtil.applicationContext = applicationContext;

    }

 

    /**

     * @return ApplicationContext

     */

    public static ApplicationContext getApplicationContext() {

        return applicationContext;

    }

 

    /**

     * 获取对象

     *

     * @param name

     * @return Object 一个以所给名字注册的bean的实例

     * @throws BeansException

     */

    public static Object getBean(String name) throws BeansException {

        return applicationContext.getBean(name);

    }

 

    /**

     * 获取类型为requiredType的对象

     * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)

     *

     * @param name

     *            bean注册名

     * @param requiredType

     *            返回对象类型

     * @return Object 返回requiredType类型对象

     * @throws BeansException

     */

    public static Object getBean(String name, Class requiredType) throws BeansException {

        return applicationContext.getBean(name, requiredType);

    }

 

    /**

     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true

     *

     * @param name

     * @return boolean

     */

    public static boolean containsBean(String name) {

        return applicationContext.containsBean(name);

    }

 

    /**

     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。

     * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)

     *

     * @param name

     * @return boolean

     * @throws NoSuchBeanDefinitionException

     */

    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {

        return applicationContext.isSingleton(name);

    }

 

    /**

     * @param name

     * @return Class 注册对象的类型

     * @throws NoSuchBeanDefinitionException

     */

    public static Class getType(String name) throws NoSuchBeanDefinitionException {

        return applicationContext.getType(name);

    }

 

    /**

     * 如果给定的bean名字在bean定义中有别名,则返回这些别名

     *

     * @param name

     * @return

     * @throws NoSuchBeanDefinitionException

     */

    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {

        return applicationContext.getAliases(name);

    }

 

}

posted @ 2015-02-04 15:25  【云】风过无痕  阅读(202)  评论(0编辑  收藏  举报