SpringBoot项目手写EventUtils事件分发器工具类

首先EventUtils工具类:

package com.example.core.event.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;

import com.example.core.context.SpringContext;
import com.example.core.event.IEvent;
import com.example.core.exception.BusinessException;

/**
 * ClassName:EventUtils 
 * Function: 事件分发器. 
 * Reason: 根据基础事件接口,可以在context中查找所有的事件实现进行处理. 
 * Date: 2020年6月30日 上午12:11:10 
 * 
 * @author demorookie
 * @version 1.0.0
 */
public final class EventUtils {

	private static final Logger logger = LoggerFactory.getLogger(EventUtils.class);

	/**
	 * 
	 * dispatcher:(事件分发器). 
	 * 定义事件执行流程.
	 *
	 * @author demorookie
	 * @param eventClass
	 * @param objects
	 */
	public static <Event extends IEvent> void dispatcher(
			Class<Event> eventClass, Object... objects) {
		logger.info("dispatch event for " + eventClass);

		try {
			Map<String, Event> eventBeanMap = SpringContext.getContext()
					.getBeansOfType(eventClass);
			if (!CollectionUtils.isEmpty(eventBeanMap)) {
				Collection<Event> eventCollection = eventBeanMap.values();
				// 对事件实现列表进行排序处理
				List<Event> events = new ArrayList<Event>();
				events.addAll(eventCollection);
				Collections.sort(events, new Comparator<Event>() {

					@Override
					public int compare(Event o1, Event o2) {
						return o1.order() - o2.order();
					}
				});
				for (Event event : events) {

					logger.debug("current dispatcher event:" + event);

					event.execute(objects);
				}
			}
		} catch (Exception e) {
			logger.warn("can't find the event impl for " + eventClass);
			logger.error("publish event fail.", e);
			throw new BusinessException("publish event fail.", e);
		}

		logger.info("dispatch event end.");
	}
	
	/**
	 * 
	 * dispatcherAsync:(分发异步任务). 
	 * 事件分发器,异步形式执行.
	 *
	 * @author demorookie
	 * @param eventClass
	 * @param objects
	 */
	public static <Event extends IEvent> void dispatcherAsync(
			final Class<Event> eventClass, final Object... objects) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				logger.info("dispatcherAsync start......");
				EventUtils.dispatcher(eventClass, objects);
				logger.info("dispatcherAsync end......");
			}
		}).start();
	}
}

公共事件接口:IEvent.java

package com.example.core.event;

/**
 * ClassName:IEvent 
 * Function: 公共事件模型基础对象. 
 * Reason: 基于Spring的对象查找机制,对注册的事件进行查找处理. 
 * Date: 2020年6月30日 上午12:11:10 
 * 
 * @author demorookie
 * @version 1.0.0
 */
public interface IEvent {

	/**
	 * 
	 * order:(事件排序号). 
	 * (事件分发器可以根据事件排序号进行排序后处理).
	 * (针对有些事件有处理顺序的可以按照排序号进行注册).
	 *
	 * @author demorookie
	 * @return 返回排序号
	 */
	int order();

	/**
	 * 
	 * execute:(事件执行器). 
	 * (执行事件内容的操作).
	 * (参数触发条件为事件实现自定义处理,任意参数且参数非必须).
	 *
	 * @author demorookie
	 * @param objects
	 *            ----可以设定被执行的对象,次对象可以在初始化的时候被调用触发
	 */
	 void execute(Object... objects);
}

获取spring上下文:SpringContext.java

/**
 * Project Name:com.example.core
 * File Name:SpringContext.java
 * Package Name:com.example.core.context
 * Date:2020年6月30日 上午12:11:10 
 *
*/

package com.example.core.context;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;

/**
 * ClassName:SpringContext <br/>
 * Function: 获取spring上下文. <br/>
 * Reason: 获取spring上下文. <br/>
 * Date: 2020年6月30日 上午12:11:10 
 * 
 * @author demorookie
 * @version 1.0.0
 */
public final class SpringContext {

	private static final Logger logger = LoggerFactory.getLogger(SpringContext.class);

	private static ApplicationContext applicationContext = null;

	public static void setApplicationContext(ApplicationContext context) throws BeansException {
		if (null == SpringContext.applicationContext) {
			SpringContext.applicationContext = context;
		}
		logger.info("=======ApplicationContext配置成功==========");
	}

	/**
	 * 
	 * getApplicationContext:(获取applicationContext). 
	 *
	 * @author demorookie
	 * @return
	 */
	public static ApplicationContext getContext() {
		return applicationContext;
	}

	/**
	 * 
	 * getBean:(通过name获取 Bean). 
	 *
	 * @author demorookie
	 * @param name
	 * @return
	 */
	public static Object getBean(String name) {
		return getContext().getBean(name);
	}

	/**
	 * 
	 * getBean:(通过class获取Bean). 
	 *
	 * @author demorookie
	 * @param clazz
	 * @return
	 */
	public static <T> T getBean(Class<T> clazz) {
		return getContext().getBean(clazz);
	}

	/**
	 * 
	 * getBean:(通过name,以及Clazz返回指定的Bean). 
	 *
	 * @author demorookie
	 * @param name
	 * @param clazz
	 * @return
	 */
	public static <T> T getBean(String name, Class<T> clazz) {
		return getContext().getBean(name, clazz);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手写一个Spring Boot项目,你可以按照以下步骤进行操作: 1. 创建一个Java项目,例如使用Maven或Gradle构建工具。 2. 引入Spring Boot的依赖。你可以在项目的配置文件(pom.xml或build.gradle)中添加相关依赖,包括Spring Boot的核心依赖和其他需要的模块。 3. 创建一个主应用程序(Main Application Class),通常以`Application`结尾,并添加`@SpringBootApplication`注解。这个是整个Spring Boot项目的入口点。 4. 在主应用程序编写启动逻辑。你可以使用`SpringApplication.run(YourApplicationClass.class, args)`方法来启动Spring Boot应用程序。 5. 编写其他的业务逻辑和组件。你可以定义Controller、Service、Repository等等,来实现你的业务需求。 6. 运行项目。你可以通过运行主应用程序的`main`方法来启动应用程序。Spring Boot会自动扫描并加载你的组件,并启动内嵌的Tomcat服务来处理HTTP请求。 通过手写模拟实现一个Spring Boot项目,你能够更好地理解Spring Boot的工作原理。你需要创建一个主应用程序,例如`UserApplication`,并添加`@SpringBootApplication`注解。在`main`方法中,使用`SpringApplication.run(UserApplication.class)`来启动应用程序。然后,你可以根据你的需求,编写其他的业务逻辑和组件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【springboot手写SpringBoot核心流程](https://blog.csdn.net/u022812849/article/details/126698122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值