zoukankan      html  css  js  c++  java
  • Spring事件发布与监听机制ApplicationEventPublisher,EventListener

    1.发布事件,一个事件增加一个方法

    public class SpringEventPublisher {
    	/**
    	 *  publish knowledge event
    	 * @param event
    	 */
    	public static void publish(DataEvent event) {
    		SpringContextUtil.getApplicationContext().publishEvent(event);
    	}
    
    }
    
    

    DataEvent

    @Data
    @AllArgsConstructor
    @ToString
    public class DataEvent {
    
    	private String id;
    
    	private String name;
    }
    

    2.工具类获取ApplicationContext

    @Slf4j
    @Component
    public class SpringContextUtil implements ApplicationContextAware {
    
        private static ApplicationContext APPLICATION_CONTEXT;
    
        @Override
        public synchronized void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringContextUtil.APPLICATION_CONTEXT = applicationContext;
        }
    
        public static ApplicationContext getApplicationContext() {
            return SpringContextUtil.APPLICATION_CONTEXT;
        }
    
    	public static <T> T getBean(Class<T> requiredType) {
        	try {
    			return getApplicationContext().getBean(requiredType);
    		} catch (Exception e) {
        		LOGGER.error("getBean error, requiredType={}", requiredType, e);
    		}
        	return null;
    	}
    }
    

    3.监听处理事件,@EventListener注解;@Async开启异步支持,防止监听器方法异常影响主流程。

    @Slf4j
    @Service
    public class DataEventListener {
       @Autowired
       private DataEventHandler eventHandler;
       /**
        *  Receive data event
        * @param event
        */
       @Async
       @EventListener(DataEvent.class)
       public void onDataEvent(DataEvent event) {
          LOGGER.info("Receive Data event: {}", event);
          // 处理事件
          eventHandler.handle(event);
          
       }
    

    总结

    ​ 使用事件监听与发布机制可以使核心业务和子业务进行解耦,方便后期扩展,多个监听器可以监听同一个事件。

    引用

  • 相关阅读:
    6、Docker Image
    5、Docker架构和底层技术
    4、Docker的安装
    3、Docker能干什么?
    2、Docker和虚拟机的对比
    1、Docker介绍
    20、Semantic-UI之数据验证
    Error:java: Compilation failed: internal java compiler error
    Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean
    spring boot自定义starter
  • 原文地址:https://www.cnblogs.com/bb-ben99/p/14012281.html
Copyright © 2011-2022 走看看