spring动态调用方法,spring动态发布接口

  spring动态调用方法,spring动态发布接口

  00-1010正好。马克,我们来问背景问题。首先,我们来看看这个方法的签名。接下来,我们来看看是什么问题。实现代码如下:关于SPI的验证。下面是JDBC驱动程序界面。下面是MySQL的JDBC驱动程序实现的SPI配置。

  00-1010组织。springframework.beans和org.springframework.context是Spring IoC容器的基础,其中重要的类是BeanFactory,它是IoC容器的核心接口。它的职责包括实例化、定位、配置应用程序中的对象以及建立这些对象之间的依赖关系。

  ApplicationContext作为BeanFactory的子类,大大增强了Bean管理的功能,更容易与Spring AOP集成。

  我们今天要讨论的不是BeanFactory或者ApplicationContext的实现原理,而是ApplicationContext的一个实际应用。

  00-1010在实际工作中,我们经常会遇到一个接口,多个实现类,不同的情况下会用到不同的实现类。

  从用法上看,有些和SPI的用法差不多,但是既然SPI的使用不是很方便,那该怎么办呢?我们可以使用ApplicationContext的GetBeanSoft来达到预期的效果。

  

目录

T MapString,T getBeansOfType(ClassT type)抛出BeansException从上面的代码我们可以看到,这个方法可以返回一个接口的所有实现类(前提是所有实现类必须由Spring IoC容器管理)。

 

  00-1010 假设从A点到B点有多种交通方式,每种交通方式费用不同,可以根据乘客的需求来选择(好吧,我承认这是一个很蹩脚的需求,但是你可以想到类似的需求,比如支付方式,快递公司。页面上提供了几个选项,业务代码根据不同的选项选择不同的实现类实例来调用)。

  00-1010回到我们的例子,根据这种运输方式的需求,我们的设计是这样的:有一个运输方式的接口,接口有两种方式,一个是查询费用,一个是查询这种运输方式的类型。同时,我们可以使用一个枚举类型类来标识流量类型。

  我们还需要一个工厂类来根据流量类型标识找到流量类型的Bean实例,这样我们就可以使用实例来获取流量类型及其操作的详细信息。

  

正好用到。mark一下背景

接口:

 

  /* * *流量模式*/公共接口流量模式{/* * *查询流量模式代码* @返回代码*/traffic code getCode();/* * *查询运输方式的费用,in * @回程费用*/Integer getFee();}枚举:

  /* * *交通类型的枚举*/公共枚举交通代码{火车、公共汽车}接口有两个实现类:

  /* * *汽车模式*/@组件公共类总线模式实现交通模式{@ override公共交通代码getcode(){ return traffic code . bus;} @Override公共整数getFee(){ return 10000;} }/* * * train mode */@ component public class train mode实现traffic mode { @ override public traffic code getcode(){ return traffic code . train;} @覆盖公共整数getFee() {

   return 9000; } }工厂类:

  

/** * 交通方式工厂类 */@Componentpublic class TrafficModeFactory implements ApplicationContextAware { private static Map<TrafficCode, TrafficMode> trafficBeanMap; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Map<String, TrafficMode> map = applicationContext.getBeansOfType(TrafficMode.class); trafficBeanMap = new HashMap<>(); map.forEach((key, value) -> trafficBeanMap.put(value.getCode(), value)); } public static <T extends TrafficMode> T getTrafficMode(TrafficCode code) { return (T)trafficBeanMap.get(code); } }

 

  

验证

有了上面的代码之后,我们一起通过单元测试来看一下效果,单元测试代码片段如下:

 

  

 @Test public void testGetTrafficMode() { TrafficMode mode = TrafficModeFactory.getTrafficMode(TrafficCode.BUS); Assert.assertEquals(mode.getFee().intValue(), 10000); mode = TrafficModeFactory.getTrafficMode(TrafficCode.TRAIN); Assert.assertEquals(mode.getFee().intValue(), 9000); }

运行之后的结果呢?必然是通过。

 

  

 

  

关于SPI

文章到这里,有同学可能会问:这和SPI有什么区别呢?SPI同样也能实现同样的功能啊。首先说明一下,SPI是JDK自带的功能,虽然历史是比较久远的了,但是不代表它不好,而且有些场景非SPI不可(比如JDBC)。

 

  我们明确一下SPI是什么以及它的设计是用来做什么的。SPI的全名为Service Provider Interface(服务提供接口),因为这个是针对厂商或者插件的。比较经典的用法就是JDBC,java提供了标准的JDBC接口,每个数据库厂商提供自己的数据库驱动实现。

  

 

  

下面是JDBC驱动的接口

public interface Driver { Connection connect(String var1, Properties var2) throws SQLException; boolean acceptsURL(String var1) throws SQLException; DriverPropertyInfo[] getPropertyInfo(String var1, Properties var2) throws SQLException; int getMajorVersion(); int getMinorVersion(); boolean jdbcCompliant(); Logger getParentLogger() throws SQLFeatureNotSupportedException;}

 

  

下面是MySQL的JDBC驱动实现的SPI配置

 

  关于SPI我们点到为止,这里只是要说明SPI和我们前面例子中使用的AP具有不同的适用场景。

  在前面的例子里,我们用的是什么呢?Spring的API,API的全称为Application Programming Interface(应用程序编程接口),在一个应用内部,使用API是非常便捷的方式,也是最直接的方式。

  总结一下,就是编程中,我们使用API是最多的。当然我们也会使用SPI(虽然我们不是严格意义上的厂商或者插件),使用SPI也是在特定场景下为了解决问题的一种途径。

  关于SPI更多的内容,以后在慢慢介绍吧。

  【附】关于SPI的约定:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。

  该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。

  基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。

  jdk提供服务实现查找的一个工具类:java.util.ServiceLoader,通过其load方法,传入接口便能获得其实现类。

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: