记录简单的接口和他的多个实现类的准确调用
IService和他的多个ServiceImpl- 代码实现
- 注解注入方式
Spring 中 IService 有多个实现类,它是如何知道该注入哪个 ServiceImpl 类?
代码实现先上接口代码
public interface IWorkFlowHandler{ IPage listPage(REQ1 req1); void add(REQ2 req2) throws IllegalAccessException; }
抽象类
@Slf4j @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public abstract class AbstractWorkFlowTemplateextends WorkflowbaseMethods implements IWorkFlowHandler { @Override public void add(REQ2 req2) throws IllegalAccessException { // 方法的具体实现 ..... ..... ..... ..... } } }
实现类
@Service("cbmWorkflowHandler")
public class CbmWorkflowHandler extends AbstractWorkFlowTemplate<
CbmQueryParam,
MerCbmVO,
CbmAddParam,
CbmUpdateParam,
CbmChangeStatusParam,
CbmDeleteParam,
CbmPassParam,
CbmRejectParam,
CbmToBeApprovalParam,
MerCbmVO,
CbmApprovalRecordParam> {
@Override
protected Integer listPage(CbmAddParam cbmAddParam) {
//listPage方法的具体实现
..................
list = getCurrentAllChildrenDeptIds();
.......
.......
........
.........
}
}
@Service("payrollWorkflowHandler")
public class PayrollWorkflowHandler extends AbstractWorkFlowTemplate<
PayrollQueryParam,
MerPayrollVO,
PayrollAddParam,
PayrollUpdateParam,
PayrollChangeStatusParam,
PayrollDeleteParam,
PayrollPassParam,
PayrollRejectParam,
PayrollToBeApprovalParam,
MerPayrollVO,
PayRollApprovalRecordParam> {
@Override
protected Integer listPage(CbmAddParam cbmAddParam) {
//listPage方法的具体实现
.......
.......
........
.........
}
}
@Service("posWorkflowHandler")
public class PosWorkflowHandler extends AbstractWorkFlowTemplate<
PosQueryParam,
MerPosVO,
PosAddParam,
PosUpdateParam,
PosChangeStatusParam,
PosDeleteParam,
PosPassParam,
PosRejectParam,
PosToBeApprovalParam,
MerPosVO,
PosApprovalRecordParam> {
@Override
protected Integer listPage(CbmAddParam cbmAddParam) {
//listPage方法的具体实现
.......
.......
........
.........
}
}
@Service("wechatWorkflowHandler")
public class WechatWorkflowHandler extends AbstractWorkFlowTemplate<
WechatQueryParam,
MerchantInformationChannelVO,
WechatAddParam,
WechatUpdateParam,
WechatChangeStatusParam,
WechatDeleteParam,
WechatPassParam,
WechatRejectParam,
WechatToBeApprovalParam,
MerchantInformationChannelVO,
WechatApprovalRecordParam
> {
@Override
protected Integer listPage(CbmAddParam cbmAddParam) {
//listPage方法的具体实现
.......
.......
........
.........
}
}
用来调用的类
这里说明下,spring的特性,建立map后,spring会自动将@service中的内容导入进map的key里面
@Component
public class WorkflowHelper {
@Autowired
private Map map;
public IWorkFlowHandler getHandler(WorkflowEnums.Type type) {
return map.get(type.getBeanName());
}
}
用到的枚举
public class WorkflowEnums {
public enum Type {
PAYROLL("payroll", "payrollWorkflowHandler", "代发薪"),
POS("pos", "posWorkflowHandler", "pos"),
WECHAT("wechat", "wechatWorkflowHandler", "微信"),
CBM("cbm", "cbmWorkflowHandler", "cbm");
public String alias;
private String beanName;
private String value;
Type(String alias, String beanName, String value) {
this.alias = alias;
this.beanName = beanName;
this.value = value;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
方法的调用
public Result> listPage(@Valid @RequestBody CbmQueryParam queryParam) { IPage returnPage = workflowHelper.getHandler(WorkflowEnums.Type.CBM).listPage(queryParam); return Result.success(returnPage); }
此抽象类还继承了一个工具集
在同包的CbmWorkflowHandler类中直接调用了该方法
@Component
public class WorkflowbaseMethods {
protected List getCurrentAllChildrenDeptIds() {
// 方法的具体实现
.................
.............
....................
}
}
注解注入方式
方法其一
Controller中注入service的时候使用@Resource(type = 类名.class)来指定注入哪一个
方法其二
1、每个service的impl都可以指定名称(使用@Service(“名称”))
2、Controller中注入service的时候使用名称来指定注入哪一个(使用@Resource(name=“名称”))。
接口
public interface HumanService {
public String name();
}
实现接口类
@Service("teacherService")
public class TeacherServiceImpl implements HumanService {
@Override
public String name() {
System.out.println("teacher");
return "teacher";
}
}
@Service("doctorService")
public class DoctorServiceImpl implements HumanService {
@Override
public String name() {
System.out.println("doctor");
return "doctor";
}
}
控制器
@RestController
public class HumanController {
@Resource(name="doctorService")
private HumanService humanService;
@RequestMapping("/name")
public String name(){
return humanService.name();
}
}
其余方法:链接: Spring 中 IService 有多个实现类,它是如何知道该注入哪个 ServiceImpl 类?.



