当前位置: 首页 > news >正文

兰溪做网站百度客服电话24小时

兰溪做网站,百度客服电话24小时,东莞常平律师事务所,有了域名 做网站一、问题的提出 在实际工作中,我们经常会遇到一个接口及多个实现类的情况,并且在不同的条件下会使用不同的实现类。 二、应用场景 springboot 项目中通过 ApplicationContext.getBeansOfType(class) 获取某一接口的所有实现类,并通过枚举完…

一、问题的提出

在实际工作中,我们经常会遇到一个接口及多个实现类的情况,并且在不同的条件下会使用不同的实现类。

二、应用场景

springboot 项目中通过 ApplicationContext.getBeansOfType(class) 获取某一接口的所有实现类,并通过枚举完成策略模式,替代 if/else,使代码更加优雅易于拓展。

三、ApplicationContext.getBeansOfType(class) 介绍

    <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException;

从上面的源码上我们可以看出来这个方法能返回一个接口的全部实现类(前提是所有实现类都必须由 Spring IoC 容器管理) 

        Map<String, TrafficModeService> map = applicationContext.getBeansOfType(TrafficModeService.class);

从上面的代码上(下面案例中工厂类有) ,Map 中的 String 的值是各个实现类的名称 busModeServiceImpl、trainModeServiceImpl(首字母小写),Map 中的 value 是各个 key 对应的策略实现类

四、案例 demo

假设从 A 点到 B 点有多种交通方式,每种交通方式的费用不同,可以根据乘客的需要进行选择。按照该需求,设计如下:

有一个交通方式的接口,接口有两个方式,一个查询费用、一个查询该交通方式的类型,同时,我们可以用一个枚举类型类标识交通类型。

我们还需要一个工厂类来根据交通类型标识查找该交通类型的 Bean 实例,从而使用该实例,获得交通类型的详细信息及该交通类型的操作。

1、TrafficCodeEmun 枚举制定接口信息

@AllArgsConstructor
public enum TrafficCodeEmun {TRAIN("TRAIN","火车"),BUS("BUS","大巴"),;private final String code;private final String desc;
}

2、TrafficModeFactory 工厂类获取接口实现 bean,并存储到 ConcurrentHashMap,通过枚举获取对应的实现 bean

@Component
@Slf4j
public class TrafficModeFactory implements ApplicationContextAware {public static final ConcurrentHashMap<TrafficCodeEmun, TrafficModeService> TRAFFIC_BEAN_MAP = new ConcurrentHashMap<>();@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("TrafficModeFactory 启动开始");Map<String, TrafficModeService> map = applicationContext.getBeansOfType(TrafficModeService.class);map.forEach((key, value) -> TRAFFIC_BEAN_MAP.put(value.getCode(), value));log.info("TrafficModeFactory 启动完成");}public static <T extends TrafficModeService> T getTrafficMode(TrafficCodeEmun code) {return (T) TRAFFIC_BEAN_MAP.get(code);}}

3、定义策略接口 TrafficModeService

public interface TrafficModeService {/*** 查询交通方式编码* @return 编码*/TrafficCodeEmun getCode();/*** 查询交通方式的费用,单位:分* @return 费用*/Integer getFee();}

4、策略实现类 BusModeServiceImpl、TrainModeServiceImpl

@Service
public class TrainModeServiceImpl implements TrafficModeService {/*** 查询交通方式编码* @return 编码*/@Overridepublic TrafficCodeEmun getCode() {return TrafficCodeEmun.TRAIN;}/*** 查询交通方式的费用,单位:分* @return 费用*/@Overridepublic Integer getFee() {return 5000;}}

5、定义 controller

    @PostMapping("/test3")public Integer test3() {Integer fee = TrafficModeFactory.getTrafficMode(TrafficCodeEmun.TRAIN).getFee();return fee;}

6、启动项目,访问 localhost:8080/testUtils/test3 测试即可看到对应接口返回

5000

五、总结

  • 一个策略接口被多个策略实现类所实现,具体使用哪一种根据用户选择的类型来和 Map 里的 key 做匹配,获取对应的实现来调用具体的策略方法。
  • 使用 ConcurrentHashMap ,而不使用 HashMap ,是 put 的时候,键和值都不能为空,防止 key 对应的实现类没有注入进去,导致空指针的问题。

六、参考文档

使用Spring的getBeansOfType实现接口多实现类的动态调用

applicationContext.getBeansOfType(class)获取某一接口的所有实现类,应用于策略模式简单demo 

http://www.ds6.com.cn/news/13858.html

相关文章:

  • 日文网站建设江门关键词排名优化
  • 网站成本费用做网站公司哪家比较好
  • 想学做网站从哪里入手推广引流软件
  • 深圳网络公司视频应用宝aso优化
  • 广州营销网站建设设计网站推广推广
  • 网站页面设计图是用什么软件画的网站推广关键词排名优化
  • 中国十大购物软件排行上海专业seo
  • ps做全屏网站画布要多大长沙网络优化产品
  • 昆山市建设局网站百度seo关键词排名价格
  • 海外服务器加速烟台seo关键词排名
  • 网站制作加教程视频海外推广渠道都有哪些
  • 自己做的网站怎么爬数据库广东seo推广方案
  • 德源网站建设网站建设制作费用
  • 厂 网站 南宁素材网
  • 网站建设和网站推广可以同一家做吗百度seo公司哪家好一点
  • 有免费建站的网站广告资源对接平台
  • 怎么做区块链网站外链网
  • 如何制作网站导航sem是什么显微镜
  • 深圳建设网站公司排名怎么做电商卖东西
  • h网站建设百度教育网站
  • 我想建立一个网站不知道怎么做啊网络营销师证书有用吗
  • 中国建设网官网网站手游推广平台代理
  • 网站建设开发客户开场白长春关键词优化排名
  • 建站行业市场分析东莞免费网站建设网络营销
  • 太原网站建设哪家强专业网站优化培训
  • 深圳网站建设黄浦网络推广普通话手抄报模板可打印
  • 动易如何做网站seo短期课程
  • 物业管理网站开发背景互联网平台有哪些
  • 成都企业网站建设哪家专业谷歌seo运营
  • 家庭电脑可以做网站吗产品网络推广的方法有哪些