前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >聊聊自定义实现的SPI如何与spring进行整合

聊聊自定义实现的SPI如何与spring进行整合

原创
作者头像
lyb-geek
修改于 2021-11-09 02:31:34
修改于 2021-11-09 02:31:34
5230
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

前言

上一篇文章主要聊聊如何实现一个带有拦截器功能的SPI。今天就来聊聊自定义的SPI如何与spring整合。

思考:我们实现的SPI要整合spring哪些东西?或者我们要利用spring的哪些特性实现我们哪些东西?

spring除了被大家熟知的IOC和AOP之外,还有它也提供了很丰富的扩展点,比如各种后置处理器,今天我们就聊聊大家相对熟悉的话题,如何通过自定义注解把SPI注入到spring容器

整合思路

1、自定义注解

代码语言:txt
AI代码解释
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Activate {

    String value() default "";
}

2、自定义bean定义扫描器

代码语言:txt
AI代码解释
复制
public class ActivateClassPathBeanDefinitionScanner extends ClassPathBeanDefinitionScanner {


    public ActivateClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {
        super(registry);
    }


    @SneakyThrows
    @Override
    protected void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) {
        super.registerBeanDefinition(definitionHolder, registry);
        Class clz = Class.forName(definitionHolder.getBeanDefinition().getBeanClassName());
        Activate activate = AnnotationUtils.findAnnotation(clz,Activate.class);
        if(ObjectUtils.isNotEmpty(activate) && StringUtils.isNotBlank(activate.value())){
            String activateName = getEnvironment().resolvePlaceholders(activate.value());
            registry.registerBeanDefinition(activateName,definitionHolder.getBeanDefinition());
        }
    }

    @Override
    protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
        return super.isCandidateComponent(beanDefinition) && beanDefinition.getMetadata()
                .hasAnnotation(Activate.class.getName());
    }

3、定义ImportBeanDefinitionRegistrar

代码语言:txt
AI代码解释
复制
public class SpiRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware {

    private Environment environment;


    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        Set<String> basePackages = this.getBasePackages(importingClassMetadata);
        String[] packages = {};
        SpiBeanUtils.registerActivateInstances(registry,environment,basePackages.toArray(packages));
    }

4、自定义enabled注解

代码语言:txt
AI代码解释
复制
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Import(SpiRegister.class)
public @interface EnableSpi {

  
    String[] value() default {};

 
    String[] basePackages() default {};

  
    Class<?>[] basePackageClasses() default {};
}

示例演示

1、在需要注入到spring容器的类上加上@Activate注解

代码语言:txt
AI代码解释
复制
@Activate("hello-mysql")
public class SpringMysqlDialect implements SpringSqlDialect {

    @Autowired
    private MysqlDialectService mysqlDialectService;

    @Override
    public String dialect() {
        return mysqlDialectService.dialect();
    }


}

2、启动类上加上扫描SPI范围注解

代码语言:txt
AI代码解释
复制
@SpringBootApplication(scanBasePackages = "com.github.lybgeek")
@EnableSpi(basePackages = "com.github.lybgeek")
public class SpiTestApplication implements ApplicationRunner 

3、利用getBeansOfType进行验证

代码语言:txt
AI代码解释
复制
 applicationContext.getBeansOfType(SpringSqlDialect.class)
                .forEach((beanName,bean) -> System.out.println(beanName + "-->" + bean));

打印结果如下

代码语言:txt
AI代码解释
复制
hello-mysql-->com.github.lybgeek.dialect.mysql.SpringMysqlDialect@433348bc

说明已经注入到spring容器中

总结

把项目的服务托管给spring ioc容器,可以算是与spring整合比较基础的动作,本文演示也是相对基础的一环,spring 强大的地方,在于它的扩展性,在spring bean的生命周期中,基本上随处可见扩展点,感兴趣的朋友后续可以自行体会验证

demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-spi-enhance/springboot-spi-framework-spring

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
亲历者复盘:网易的 Envoy 网关选型、开发与改造
采访 | 蔡芳芳 编辑 |王一鹏 发现并应用一个性能卓越的、云原生、能适应至少未来五年架构趋势的 API 网关,现今已经成为基础架构团队的必做命题,否则整个基础设施架构可能是存在某些先天缺陷的,且维护成本相当之高。Envoy 正是在这种背景下走进大众视野,且非常契合各大技术团队的下一代网关“明星选手”。 Google、IBM、微软等跨国巨型企业对 Envoy 的使用已经相当深入,这种信任并非源于简单的,诸如“云原生”、“下一代”之类的噱头概念,而是可从其 TPS 表现获得更直观的印象。早在 2020
深度学习与Python
2023/02/28
8510
亲历者复盘:网易的 Envoy 网关选型、开发与改造
Apisix-Ingress服务发现详解
Apache APISIX 是一个基于微服务 API 网关,其不仅可以处理南北向的流量,也可以处理东西向的流量即服务之间的流量。Apache APISIX 集成了控制面板和数据面,与其他 API 网关相比,Apache APISIX 的上游、路由、插件全是动态的,修改这些东西时都不用重启。并且 Apache APISIX 的插件也是热加载,可以随时插拔、修改插件。
tunsuy
2023/10/23
6680
Apisix-Ingress服务发现详解
支持 10 亿日流量的基础设施:当 Apahce APISIX 遇上腾讯
本文整理自腾讯游戏负责内部容器平台的工程师徐鑫在 Apache APISIX Meetup - 深圳站上的演讲,通过阅读本文,您不仅可以了解网关是什么、网关模式对传统服务架构的改进,还可以了解腾讯 OTeam 诞生的原因,以及 Apache APISIX 是如何在腾讯内部落地的。欢迎感兴趣的同学访问 bilibili 观看视频。 我们有必要先了解一下 网关 (Gateway) 的作用和价值。 PART ONE 网关是什么 传统架构的通用功能 在传统的架构中,没有网关,那么通用功能该怎么复用起来呢?这
腾源会
2021/09/03
5560
基于 Apache APISIX,爱奇艺 API 网关的更新与落地实践
本文整理自爱奇艺高级研发师何聪在 Apache APISIX Meetup - 上海站的演讲,通过阅读本文,您可以了解到基于 Apache APISIX 网关,爱奇艺技术团队是如何进行公司架构的更新与融合,打造出全新的网关服务。欢迎感兴趣的同学点击阅读原文访问 bilibili 观看视频。 作者何聪,高级研发师,IIG 基础架构部 - 计算云,主要负责爱奇艺网关开发和运维工作
深度学习与Python
2021/10/13
8010
云原生时代的流量入口:Envoy Gateway
流量入口代理作为互联网系统的门户组件,具备众多选型:从老牌代理 HAProxy、Nginx,到微服务 API 网关 Kong、Zuul,再到容器化 Ingress 规范与实现,不同选型间功能、性能、可扩展性、适用场景参差不齐。当云原生时代大浪袭来,Envoy 这一 CNCF 毕业数据面组件为更多人所知。那么,优秀“毕业生”Envoy 能否成为云原生时代下流量入口标准组件?
深度学习与Python
2020/08/07
2.2K0
云原生时代的流量入口:Envoy Gateway
基于 Apache APISIX 的全流量 API 网关
温铭 支流科技 CEO 兼联合创始人 本文将从云原生时代的机遇和挑战说起,介绍一个全新的开源高性能云原生 API 网关——Apache APISIX,探讨如何解决云原生时代 API 网关所面临的一些痛点,最后介绍该开源项目未来的规划。 背景 云原生的机遇和挑战 很多应用和服务都在向微服务、容器化迁移,形成新的云原生时代。云原生是下一个 5-10 年的技术颠覆,重写了传统企业的技术架构,例如云原生中的 Kubernetes 颠覆了传统操作系统,所有的“主机”(node 上的容器)由 Kubernetes
博文视点Broadview
2023/05/19
1.6K0
基于 Apache APISIX 的全流量 API 网关
基金交易场景下,如何利用 Apache APISIX 来稳固 API 安全
金融领域的企业中,安全是非常重中之重的因素。通常各类金融企业都会花费大量成本去采购安全相关的设备和硬件,基金管理相关企业更是如此。
深度学习与Python
2022/11/28
3810
基金交易场景下,如何利用 Apache APISIX 来稳固 API 安全
如何选择适合你的微服务 API 网关:对比 Kong、APISIX、Trk、Apigee 和其他网关
API 网关并非一个新兴的概念,在十几年前就已经存在了,它的作用主要是作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。它有以下传统的功能:
温铭@APISIX
2020/02/24
4.1K1
Apache APISIX 在移动云对象存储 EOS 的应用与实践
中国移动云能力中心作为中国移动云设施构建者、云服务提供者以及云生态汇聚者,承担了移动云的技术研发、规划建设、运营维护、 合作引入、销售支撑、支持上云六大工作职责。
深度学习与Python
2021/10/13
7570
保姆级教程,从概念到实践帮你快速上手 Apache APISIX Ingress
作者:张晋涛,Apache APISIX Committer、Kubernetes Ingress Nginx Reviewer,多个云原生开源项目的贡献者。
Jintao Zhang
2021/10/25
7.4K2
K8S Ingress 之 Apache APISIX 解析
在云原生时代,基于主流的云操作系统 Kubernetes ,其常见的外部流量访问方式主要基于以下 NodePort、LoadBalancer 以及 Ingress 等。
Luga Lee
2021/12/09
3.9K0
K8S Ingress 之 Apache APISIX 解析
为什么 APISIX Ingress 是比 Emissary-ingress 更好的选择?
Kubernetes Ingress 是一种 API 对象,用于定义集群外部流量如何路由到集群内部服务的规则。Ingress Controller 通常用于实现 Ingress 资源的相关逻辑,并统一管理这些流量规则。
米开朗基杨
2023/09/13
4520
为什么 APISIX Ingress 是比 Emissary-ingress 更好的选择?
放弃 Spring Cloud Gateway!Apache APISIX在「还呗」业务中的技术实践
作者 | 王晔倞 编辑 | 褚杏娟 不同行业之间,都会存在一些业务属性上的差距。对于金融领域的应用软件来说,因其涉及到钱等因素,所以在业务上会有以下独特属性: 稳定性。金融领域跟钱强相关,这对于业务稳定性就有着非常严格的要求,稳定性一旦出现问题,它将影响整个交易系统的成败。 强监管。强监管一般是针对生物医药领域、医疗领域和金融领域,因为它们所呈现的内容都与人的生命相关。所以,更高层面的强监管要求势必会影响一些业务层面的选型和架构呈现。 准确性和有效性。由于跟钱强相关,所以在数字层面的呈现更是要求零偏差
深度学习与Python
2023/03/29
6890
放弃 Spring Cloud Gateway!Apache APISIX在「还呗」业务中的技术实践
服务网格领域的百花齐放,是否存在一个更优解?
服务网格是一种技术架构,它用于管理微服务系统中各个服务之间的通信,旨在处理微服务间的流量(也称为东西向流量)。
米开朗基杨
2023/09/13
2710
服务网格领域的百花齐放,是否存在一个更优解?
Apache Apisix初体验
Apache APISIX 是一个基于 OpenResty 和 Etcd 实现的动态、实时、高性能的 API 网关,目前已经是 Apache 的顶级项目。提供了丰富的流量管理功能,如负载均衡、动态路由、动态 upstream、A/B测试、金丝雀发布、限速、熔断、防御恶意攻击、认证、监控指标、服务可观测性、服务治理等。可以使用 APISIX 来处理传统的南北流量以及服务之间的东西向流量。
mikelLam
2022/10/31
1.1K0
Apache Apisix初体验
马蜂窝如何利用 APISIX 网关实现微服务架构升级
作者 | 董红帅,马蜂窝微服务体系建设以及基础服务能力建设专家。 马蜂窝作为旅行社交平台,是数据驱动的新型旅行电商。基于十余年的内容积累,马蜂窝通过 AI 技术与大数据算法,将个性化旅行信息与来自全球各地的旅游产品供应商实现连接,为用户提供与众不同的旅行体验。 随着业务的发展,马蜂窝架构也在跟随技术步伐进行更迭,开始基于 Kubernetes 进行更多的延展。在这个技术背景下,需要针对云服务开启新一轮的架构更新,比如:微服务场景建设新的蜂效平台及周边设施来支持迭代和流量泳道的能力,在多 Kubernete
深度学习与Python
2023/03/29
7020
马蜂窝如何利用 APISIX 网关实现微服务架构升级
主流云原生微服务API网关成熟度与安全功能对比分析
在整个微服务架构中,API网关充当着非常重要的一环,它不仅要负责外部所有的流量接入,同时还要在网关入口处根据不同类型请求提供流量控制、日志收集、性能分析、速率限制、熔断、重试等细粒度的控制行为。API网关一方面将外部访问与微服务进行了隔离,保障了后台微服务的安全,另一方面也节省了后端服务的开发成本,有益于进行应用层面的扩展。与此同时,API网关也应具备解决外界访问带来的安全问题,例如TLS加密、数据丢失、跨域访问、认证授权、访问控制等。本文尝试分析目前主流的云原生微服务API网关成熟度以及各自具备的安全功能,并比较各自带来的优劣,尤其在安全层面上,开源软件都做了哪些工作,是否全面,若不全面我们又该如何弥补。
绿盟科技研究通讯
2020/01/02
3.1K0
Apache Apisix轻松打造亿级流量Api网关
APISIX API 网关提供负载均衡、动态上行、灰度发布、熔断、鉴权、可观测等丰富的流量管理功能。
架构狂人
2023/10/24
1.3K0
Apache Apisix轻松打造亿级流量Api网关
云原生时代,API 网关为何如此重要?
【CSDN 编者按】API是Application Program Interface,应用程序连接接口的缩写,作为数据传输流转的重要通道,API网关更成为云原生时代的重要入口。 作者 | 温铭,Apache APISIX PMC主席 责编 | 张红月 出品 | CSDN(ID:CSDNnews) API 是各个不同的应用程序和系统之间互相调用和传输数据的标准方式。在很多的开发团队中都是使用 API-first 的模式,围绕着 API 来进行产品的迭代,包括测试、Mock、文档、API 网关、Dev Po
博文视点Broadview
2023/04/04
7000
云原生时代,API 网关为何如此重要?
舍弃Kong和Nginx,Apache APISIX 在趣链科技 BaaS 平台的落地实践
作者 | 盛威锋 审校 | 蔡芳芳 本文介绍了 Apache APISIX 在趣链科技 BaaS 平台中的落地实践情况,以及趣链科技在众多网关应用中选择 Apache APISIX 的原因。 1业务背景 BaaS(Blockchain as a Service),中文为“区块链即服务”,是指将区块链框架嵌入云计算平台,利用云服务基础设施的部署和管理优势,为开发者提供便捷、高性能的区块链生态环境和生态配套服务,支持开发者的业务拓展及运营支持的区块链开放平台。 通常情况下,一套完整的 BaaS 解决方案包括设备
深度学习与Python
2023/04/01
4770
舍弃Kong和Nginx,Apache APISIX 在趣链科技 BaaS 平台的落地实践
推荐阅读
相关推荐
亲历者复盘:网易的 Envoy 网关选型、开发与改造
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文