基本思路:使用静态map存储对象的class,通过map获取class文件实现策略,通过spring特性获取bean实现委派处理(单层或者多层)
业务场景:使用if判断多个场景的情况,业务代码臃肿难以分离时
不足之处:需要对静态map维护,动态维护方法
高级处理方式:可以配置数据库中对应的类名,通过redis缓存获取K-V对应的类名,再通过spring获取实例对象处理(内存维护处理和可配置化处理考虑)
本案例仅列举了第一层,多层委派处理一样,实际业务中已处理多层
具体实现如下:
工程结构
测试类见最下面
1.maven部分
依赖lombok,主要是类上的日志注解部分
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
2.springboot工程部分请参考其他文章或者本人其他博客
3.具体代码
spring获取bean工具类
@Component
public class SpringBeanUtils implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public <T> T getBean(Class<T> aclass) {
return applicationContext.getBean(aclass);
}
}
4.业务实现
4.1实体对象
@Data
public class OrderInfo {
private String j_country;
private String d_country;
private String d_province;
private String d_city;
private String d_address;
private String express_type;
private String d_post_code;
private String declared_value;
}
接口
public interface ICheckCountryService {
void checkCountry(OrderInfo orderInfo);
}
核心代码
@Service
public class CountryService implements ICheckCountryService {
/**
* 实现思路,使用静态map结合spring的特性来实现,最终业务的委派处理,从而避免的if else过多的不利于代码维护的情况
*/
private static final Map<String, Class<? extends ICheckCountryService> > map = new HashMap<>();
static {
map.put("FR", FRCountryService.class);
map.put("CN", CNCountryService.class);
}
@Resource
private SpringBeanUtils springBeanUtils;
@Override
public void checkCountry(OrderInfo orderInfo) {
Class<? extends ICheckCountryService> aClass = map.get(orderInfo.getD_country());
if (Objects.nonNull(aClass)) {
ICheckCountryService bean = springBeanUtils.getBean(aClass);
bean.checkCountry(orderInfo);
}
}
}
业务代码,可以依照CountryService 以及对详细参数委派
@Service
@Slf4j
public class CNCountryService implements ICheckCountryService{
/**
* 如果有其他校验,还可以按照CountryService 那样委派,到最终的类去处理
*/
private static final Map<String, Class<? extends ICheckCountryService> > map = new HashMap<>();
@Resource
private SpringBeanUtils springBeanUtils;
@Override
public void checkCountry(OrderInfo orderInfo) {
log.info("当前处理的国家:{}",orderInfo.getD_country());
}
}
业务代码,可以依照CountryService 以及对详细参数委派
@Service
@Slf4j
public class FRCountryService implements ICheckCountryService{
@Override
public void checkCountry(OrderInfo orderInfo) {
log.info("当前处理的国家:{}",orderInfo.getD_country());
}
}
测试类
@Autowired
private CountryService countryService;
/**
* 校验数据,对比2
* @return
*/
@RequestMapping(value = "checkParam")
public String checkParam(@RequestBody OrderInfo orderInfo){
if(Country.CN.equals(orderInfo.getD_country())){
//业务处理
log.info("处理业务1");
}else if (Country.FR.equals(orderInfo.getD_country())){
//业务处理
log.info("处理业务2");
}
return "OK";
}
@RequestMapping(value = "checkParam2")
public String checkParam2(@RequestBody OrderInfo orderInfo){
log.info("请求参数:{}",orderInfo);
countryService.checkCountry(orderInfo);
return "OK";
}
报文参数
{
"d_country":"FR"
}
效果