如果一个接口实现了不同的类,如何做到自动化配置的问题
未自动配置的方式如下
/**
* 通过判断入参,确定调用哪个实现类
* @param param
* @return
*/
@GetMapping("aa")
public String aa(Integer param){
if(param.equals(1)){
tigerService.run("老虎");
}
if(param.equals(2)){
lionService.run("狮子");
}
return "";
}
缺点:可优化,多了if不够简洁
思路:
可以做个配置类,把参数和实现类绑在一起,通过调用接口,找到实现此接口对应的实现类,用以
实现自动配置查找
①新增配置类(入参与实现类之间)
/**
* @author huyujie
* @date 2023/7/7 10:05
*/
@Component
public class AutoConfig {
public static Map<Integer, Class<? extends IRunService>> TYPE_CONFIG = MapUtil
.builder(new HashMap<Integer, Class<? extends IRunService>>())
.put(1, TigerServiceImpl.class)
.put(2, LionServiceImpl.class)
.build();
}
②调用接口(通过调用接口,以实现调用不同的类方法)
/**
* 通过判断入参,确定调用哪个实现类
*
* @param param
* @return
*/
public String aa(Integer param) {
try {
Class<? extends IRunService> implClass = AutoConfig.TYPE_CONFIG.get(param);
//查库,获取入参,假设查库完毕
String result = "666";
implClass.newInstance().run(result);
//也可采取此种方式调用
// IRunService iRunService = SpringUtil.getBean(implClass);
//iRunService.run(result);
} catch (Exception e) {
log.error("未配置实现类:{}", e.getMessage());
e.printStackTrace();
}
return "";
}
③实现类内部编写
/**
* 狮子实现类
*
* @author huyujie
* @date 2023/7/7 9:47
*/
@Service
@Slf4j
public class LionServiceImpl implements IRunService {
@Override
public String run(String param) {
return param + "狮子";
}
}
/**
* 老虎实现类
*
* @author huyujie
* @date 2023/7/7 9:45
*/
@Service
@Slf4j
public class TigerServiceImpl implements IRunService {
@Override
public String run(String param) {
return param + "跑步";
}
}