栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

IService和他的多个ServiceImpl

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

IService和他的多个ServiceImpl

记录简单的接口和他的多个实现类的准确调用

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 AbstractWorkFlowTemplate
        extends 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 类?.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356089.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号