# routeservice **Repository Path**: mirrors_gspandy/routeservice ## Basic Information - **Project Name**: routeservice - **Description**: 内部服务路由的实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-10 - **Last Updated**: 2025-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 内部服务路由的实现 ## 问题 对于一个业务接口服务它可以有多个实现类。对于使用者来说,需要指定它所使用的是哪一个实现。比如一个接口: ### 接口定义 interface DemoService{ void printStr(String str); } @Service("printerService") class PrinterServiceImpl implements DemoService{ public void printStr(String str){ System.out.println("use printer print"+str); } } @Service("copyerService") class CopyerServiceImpl implements DemoService{ public void printStr(String str){ System.out.println("use copyer print"+str); } } (比如上述的接口对应的一个业务场景发短信,131,132,133走联通的通道发出去; 136,137,139走移动的通道发出去;等等业务情形) 当我们在业务类中使用这个上述接口时,需要明确的指定我们需要使用的是哪一个实现类接口;对于代码多数情形定义如下: ### 业务代码实现 public class BizClazz implements BizInterface{ @Autowired @Qualifier("printerService") private DemoService printerService; @Autowired @Qualifier("copyerService") private DemoService copyerService; public void bizMethod(String str,String routeCode){ if("copyer".equals(routeCode){ copyerService.printStr(Str); }else{ printerService.println(Str); } } } 如果按照这个思路,业务代码中处处都是这样的if else 代码,那么能否解决掉这样的代码呢?答案是肯定的。对于服务实现类的路由,在java中最好的解决办法即为代理+反射。 ## 解决方案 ### 重新定义接口 package c.z.route; @RouteService //接口增加注解 interface DemoService{ void printStr(String str,@RouteParam String routeCode/*路由参数增加注解*/); } @Service("printerDemoService")/*命名规则为 routeCode 小写+接口的短名 */ class PrinterServiceImpl implements DemoService{ public void printStr(String str,String routeCode){ System.out.println("use printer print"+str); } } @Service("copyerDemoService") class CopyerServiceImpl implements DemoService{ public void printStr(String str ,String routeCode){ System.out.println("use copyer print"+str); } } ### 业务代码重构 public class BizClazz implements BizInterface{ @Autowired @Qualifier("c.z.route.DemoService")/*接口代理实现的命名规则默认为:接口的全称*/   private DemoService demoService; public void bizMethod(String str,String routeCode){ demoService.printStr(str,routeCode); } } ## 使用方式 ### jar依赖 c.z routeservice 0.0.1-SNAPSHOT ### spring配置 ### 适用范围 即在定义接口时,每个方法都需要显示的传递路由参数; ## 技术要点 本jar主要抄写mybatis-spring的思路及大部分代码。即对于任一个满足条件(注解)的接口进行代理,提供给用户使用。而真正的实现,则可以只关注一个方面,从而避免了太多的判断条件。 接口spring注入命名要点: |业务接口|命名规范|实现者|使用者| |-------|-------|-----|-----| |c.z.route.DemoService|接品全称:c.z.route.DemoService|框架代理实现|业务接口消费者| |c.z.route.DemoService|routeCode小写+接口SimpleName:printerDemoService|真实业务提供者实现|框架代理| |c.z.route.DemoService|routeCode小写+接口SimpleName:copyerDemoService|真实业务提供者实现|框架代理|