需求描述
使用spring提供的initializingBean接口实现动态路由,一个接口多个实现类,也就是多态,向外部提供统一
的接口,根据传入的参数进行判断需要执行的实现类
目标实现
- 首先定义一个对外接口
public interface RouterHandler{
/** 对外暴露接口 */
public void riskRouterHandler(String type);
}
- 实现该接口,并实现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();
}
- 接口实现类
@Component
public class RiskHndlerImpl implements RiskHandler{
/** 实现输出方法 */
public void riskPrintln(){
System.out.println("类型为1的实现类");
}
/** 需要返回实现对应的类型,用于在启动时对应 */
public String getType(){
return "1";
}
}
也可以将具体的类型换成枚举类型,这个要再根据的自己的业务需要去制定,需要注意的是,getType方法返回的类型要与Map中key 的类型一致。