最近在做一个项目,项目中涉及到需要把 相应的接口发布成HTTPInvoker 服务,正常的情况下 通过配置完全可以实现,但是 每一的接口及其实现都要配置一遍在比较少的情况下完全没有问题,但是如果出现大量的接口都要发布成这样的服务 维护的工作量是比较大的,因此想到了标记接口的做法,所有的类去实现一个标记接口,通过spring 通过spring 容器获取所有实现此标记接口了实体 然后动态的发布成HTTPInvoker 服务(及bean),关于动态发布成springbean 可以看我的上篇文章。

看具体的代码

package com.baiwang.custom.web.base;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

/**
 * @author wjh
 * @Description HttpInvokerScan 用于扫描发布需要发布成HttpInvoker的类,通过监听<link>ContextRefreshedEvent</link> 事件
 * 				在容器发布完成后进入扫描。扫描所有实现 <link>HTTPInvokerService</link> 接口的类,实现自动化注册。
 * 
 * 
 */
@Component
public class HttpInvokerScan implements ApplicationListener<ContextRefreshedEvent>{

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

	/**
	 * @Description 事件监听入口<link>ContextRefreshedEvent</link>,通过<link>BeanUtil</link>进行注册
	 * @param ContextRefreshedEvent 
	 */
	@Override
	public void onApplicationEvent(ContextRefreshedEvent arg0) {
		long timeBegin= System.currentTimeMillis();
		logger.info("==>注册HttpInvoker服务 Begin");
		//获取HTTPInvokerService.class 接口的所有实现对象
		Map<String,HTTPInvokerService> resultMap =BeanUtil.applicationContext.getBeansOfType(HTTPInvokerService.class);
		//遍历实现类 并注册为HttpInvoker
		for(Map.Entry<String,HTTPInvokerService> entity :resultMap.entrySet()) {
			String beanName=entity.getKey();
			HTTPInvokerService invoker = entity.getValue();
			//进行注册
			BeanUtil.registAsInvokerBean(beanName, invoker);
		}
		logger.info("==>注册HttpInvoker服务 End 耗时 "+(System.currentTimeMillis()-timeBegin) +"mm");
	}

}

其实类似于定时任务 也是可以通过这种方式实现,以减少维护工作。标记接口的功能和 java 注解很像,但是通过结合spring的容器,使用标记接口的方式显得更加的方便快捷。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐