使用initializingBean实现动态路由

需求描述

使用spring提供的initializingBean接口实现动态路由,一个接口多个实现类,也就是多态,向外部提供统一
的接口,根据传入的参数进行判断需要执行的实现类

目标实现

  1. 首先定义一个对外接口
public interface RouterHandler{
	/** 对外暴露接口 */
	public void riskRouterHandler(String type);	
}
  1. 实现该接口,并实现initializingBean
@Component
public class RoterHandlerImpl implements RouterHandler,InitializingBean{

	Map<String,RiskHandler> handlerMap = Maps.newHashMap();
	
	@Autowired
	private List<RiskHandler> riskHandlerService;
	
	@Override
	public void afterPropertiesSet() throws Exception{
		for(RiskHandler riskHandler : riskHandlerService){
			handlerMap.put(riskHandler.getType,riskHandler);
		}
	}
	
	@Override
	public void riskRouterHandler(String type){
		RiskHandler riskHandler = handlerMap.get(type);
		return riskHandler.riskPrintln();
	}
}

定义一个map,里面装有和类型对应的实现类,afterPropertiesSet方法会在项目启动的时候执行,这时就可以将接口的所有实现类与对应类型添加到map中,当外部调用接口时,需要根据类型路由到对应的实现类中,RoterHandlerImpl只是一个路由的实现类,具体方法的实现是RiskHandler接口中,RiskHandler接口中的方法是不用暴露到外部的。
3. 编写具体的实现接口

public interface RiskHandler{

	/** 实现输出方法 */
	public void riskPrintln();
	
	/** 需要返回实现对应的类型,用于在启动时对应 */
	public String getType();
}
  1. 接口实现类
@Component
public class RiskHndlerImpl implements RiskHandler{
	/** 实现输出方法 */
	public void riskPrintln(){
		System.out.println("类型为1的实现类");
	}
	
	/** 需要返回实现对应的类型,用于在启动时对应 */
	public String getType(){
		return "1";
	}
}

也可以将具体的类型换成枚举类型,这个要再根据的自己的业务需要去制定,需要注意的是,getType方法返回的类型要与Map中key 的类型一致。

还有一点@Component这个注解不要忘记写,要不然riskHandlerService是扫不到,因为我经常忘记写,写大点提醒下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值