背景:
不同的服务实例类型,具有相同的业务流程,可以根据入参来确定获取哪一个服务实例去执行业务流程
(工厂模式获取服务实例)
1.Controller 说明:根据String id这个入参获取对应处理job的实际serviceImpl实例
import com.up.test.service.InstanceService;
import com.up.test.service.InstanceServiceFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FactoryController {
@Autowired
private InstanceServiceFactory instanceServiceFactory;
@GetMapping("/getInstance/{id}")
public String getInstance(@PathVariable("id") String id) throws Exception {
InstanceService instance = instanceServiceFactory.getInstance(id);
Object job = instance.job(id);
return job.toString();
}
}
2.服务实例工厂,项目启动的时候,服务对应的bean会被加载进instanceMap 中
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 实例服务工厂类
*
* @param <T>
*/
@Service
public class InstanceServiceFactory<T> {
/**
* 初始化服务类
*/
@Resource
private final Map<String, InstanceService<T>> instanceMap = new ConcurrentHashMap<>();
/**
* 获取实现类
*/
public InstanceService<T> getInstance(String id) throws Exception {
InstanceService<T> instanceService = instanceMap.get(id);
if (ObjectUtil.isNull(instanceService)) {
throw new Exception("实例服务工厂获取异常,id编号未配置");
}
return instanceService;
}
}
3.服务接口(对应三个实现)
/**
* 服务接口
*
* @param <T>
*/
public interface InstanceService<T> {
T job(String str) throws Exception;
Object getConfig(String supplierNo);
}
4.抽象实例服务
public abstract class AbstractInstanceService<T> implements InstanceService<T> {
/**
* 获取配置文件,现在配置都在nacos配置,是否迁移到数据库中维护?
*/
@Override
public Object getConfig(String supplierNo) {
return null;
}
}
5.具体实现1:
import org.springframework.stereotype.Service;
@Service(value = "apple")
public class AppleInstanceService extends AbstractInstanceService {
@Override
public Object job(String id) {
return "apple";
}
}
6.具体实现2:
import org.springframework.stereotype.Service;
@Service(value = "banana")
public class BananaInstanceService extends AbstractInstanceService {
@Override
public Object job(String id) {
return "banana";
}
}
7.在controller 对应的/getInstance/{id}接口中,id替换为"apple" 或者 “banana”。在运行的时候,就会对应的输出其实现类中job 的输出值。