最近在做一个项目,项目中涉及到需要把 相应的接口发布成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的容器,使用标记接口的方式显得更加的方便快捷。