您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot中一接多口实现

时间:2020-11-05 11:21:58  来源:  作者:

一般常规场景是一接口一个实现实例,就像这样子

public interface ISayService {
    String say();
}

@Service
public class SayServiceImpl implements ISayService {
    @Override
    public String say() {
        return "帅哥/美女,你们长得真好看";
    }
}

然后直接通过Autowired来获取实例

@Api(value = "Demo", tags = {"Demo"})
@RestController
@RequestMApping("query")
public class DemoController {

    @Autowired
    ISayService sayService;

    @ApiOperation(value = "查询信息", notes = "查询信息")
    @PostMapping("info")
    public ResponseEntity queryInfo() {

        return ResponseEntity.ok(sayService.say());
    }
}

现在我们要做一个类似网关的鉴权功能,所有要调外部接口的的应用都调我们的接口,接口调用者只需要传入约定好的标识和参数即可得到相应接口的结果,服务端根据参数去判断是调用的哪个接口,因为不同厂商的接口逻辑和鉴权不一样,所以,有时候就要根据不同的厂商去实现一套逻辑,那么在程序调用的时候,就会涉及到多个实例,根据调用者参数去获取不同的实例并执行。

上面的例子是,不管男女,我都说:"长得真好看",但是我可能,对女生说:"美女,你好漂亮啊",对男生说:"帅哥,你真是超帅"。其实,Spring也给我们提供好几种方式,这里,我就把我知道的几种记录下来吧。

@Service("sayService")
public class SayServiceImpl implements ISayService {
    @Override
    public String say() {
        return "帅哥/美女,你们长得真好看";
    }
}

@Service("girlService")
public class GirlServiceImpl implements ISayService {
    @Override
    public String say() {
        return "美女,你好漂亮啊";
    }
}

@Service("boyService")
public class BoyServiceImpl implements ISayService {
    @Override
    public String say() {
        return "帅哥,你真是超帅";
    }
}

注意,多个实例,一定要在Service注解中加入对应的标识,不然会报错哟,

Spring Boot中一接口多实现

 

好了,实现类都弄好了,那么来看看怎么调用呢?这里有我们知道的有三种,第一种就是通过变量名,就像这样子

 @Autowired
    ISayService sayService;

    @Autowired
    ISayService girlService;

    @Autowired
    ISayService boyService;

它会通过变量命名去取出注入到容器中的实例类,第二种就是通过Qualifler,

@Autowired
    @Qualifier("sayService")
    ISayService service1;

    @Autowired
    @Qualifier("girlService")
    ISayService service2;

    @Autowired
    @Qualifier("boyService")
    ISayService service3;
Spring Boot中一接口多实现

 

前面两种都是比较固定的,在我现在这个功能中是不合适的,所以,就需要第三种了,通过ApplicationContextAware来获取实例,这里我们先新建一个类来继承ApplicationContextAware类

@Component
public class ApplicationContextHandler implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

}

这里我们直接通过名字去获取实例


@Api(value = "Demo", tags = {"Demo"})
@RestController
@RequestMapping("query")
public class DemoController {

    @ApiOperation(value = "查询信息", notes = "查询信息")
    @PostMapping("info")
    public ResponseEntity queryInfo(String beanName) {
        ISayService sayService=(ISayService) ApplicationContextHandler.getBean(beanName);
        return ResponseEntity.ok(sayService.say());
    }
}

好,现在我们传入不同的beanName来动态获取实例并执行,我们来看看效果

Spring Boot中一接口多实现

 

 

Spring Boot中一接口多实现

 

这里,把我们同事写的SpringUtils类粘贴出来,当然,我也不知道他是在哪里的复制粘贴的

@Component
public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext APPLICATION_CONTEXT = null;

    private SpringUtils() {

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtils.APPLICATION_CONTEXT == null) {
            SpringUtils.APPLICATION_CONTEXT = applicationContext;
        }
    }

    /**
     * 获取ApplicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return APPLICATION_CONTEXT;
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

今天就先到这里吧,大叔准备下班回家了。虽然年纪大了,但是还是每天学习一点,每天进步一点。如果有哪里写得不对的,还请各位小友指正,只有不断试错,才能慢慢提高。如果你觉得对你有帮助,请点赞+关注,谢谢!!!!!!



Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言一个基于spring boot的JAVA开源商城系统,是前后端分离、为生产环境多实例完全准备、数据库为b2b2c商城系统设计、拥有完整下单流程和精美设计的java开源商城系统https://...【详细内容】
2021-09-17  Tags: Spring Boot  点击:(119)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: Spring Boot  点击:(173)  评论:(0)  加入收藏
大家都知道,MyBatis 框架是一个持久层框架,是 Apache 下的顶级项目。Mybatis 可以让开发者的主要精力放在 sql 上,通过 Mybatis 提供的映射方式,自由灵活的生成满足需要的 sql 语句。使用简单的 XML 或注解来配置和映射原...【详细内容】
2021-07-06  Tags: Spring Boot  点击:(96)  评论:(0)  加入收藏
首先,先看 SpringBoot 的主配置类:@SpringBootApplicationpublicclassStartEurekaApplication{publicstaticvoidmain(String[] args){SpringApplication.run(StartEurekaAppli...【详细内容】
2021-06-11  Tags: Spring Boot  点击:(144)  评论:(0)  加入收藏
今天又要给大家介绍一个 Spring Boot 中的组件 --HandlerMethodReturnValueHandler。在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何...【详细内容】
2021-03-24  Tags: Spring Boot  点击:(297)  评论:(0)  加入收藏
环境:SpringBoot2.3.9.RELEASE + SpringBootAdmin2.3.1说明:如果使用SpringBootAdmin2.4.*版本那么SpringBoot的版本也必须是2.4.*否则启动报错。Spring Boot Admin(SBA)是一个...【详细内容】
2021-03-22  Tags: Spring Boot  点击:(350)  评论:(0)  加入收藏
要让项目实现 ssl 免密登录,首先需要开启 https 。所以先从 Spring Boot 如何开启 https 说起。创建服务端证书为了开启 https ,我们需要一份证书。实际开发中,会在网上申请一...【详细内容】
2021-01-07  Tags: Spring Boot  点击:(158)  评论:(0)  加入收藏
短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信...【详细内容】
2020-12-31  Tags: Spring Boot  点击:(185)  评论:(0)  加入收藏
在平常的开发过程中,我们经常需要对接口响应时间进行优化,但是呢个人感觉每次都去看浏览器的网络请求比较麻烦,因此,小编自己自己手写代码实现在控制台打印接口响应时间,这样非常...【详细内容】
2020-12-23  Tags: Spring Boot  点击:(713)  评论:(0)  加入收藏
前言在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。那么何为限流呢?顾...【详细内容】
2020-12-15  Tags: Spring Boot  点击:(121)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条