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

成立网站建设公司要求推广赚钱平台

成立网站建设公司要求,推广赚钱平台,制作外贸网站的公司,代码生成器手机版面试回答 Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,API 直接被应用开发人员使用,SPI 被框架扩展人员使用。 API Application Programming Interface 大多数情况下&#xff…

面试回答

Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,API 直接被应用开发人员使用,SPI 被框架扩展人员使用。

API Application Programming Interface

大多数情况下,都是实现方来制定接口并完成对接口的不同实现,调用方仅仅依赖却无权选择不同实现。

SPI Service Provider Interface

而如果是调用方来制定接口,实现方来针对接口实现不同的实现。调用方来选择自己需要的实现方。

知识扩展

如何定义一个 SPI

步骤1、定义一组接口(假设是 com.chiyi.test.IShout),并写出接口的一个或多个实现,(假设是 com.chiyi.test.Dogcom.chiyi.test.Cat)。

public interface IShout {void shout();
}
public class Dog implements IShout{@Overridepublic void shout() {System.out.println("wang wang");}
}
public class Cat implements IShout{@Overridepublic void shout() {System.out.println("miao miao");}
}

步骤2、在 src/main/resources/ 下建立 /META-INF/services目录,新增一个以接口命名的文件(com.chiyi.test.IShout 文件),内容是要应用的实现类(这里是 com.chiyi.test.Dogcom.chiyi.test.Cat,每行一个类)。

com.chiyi.test.Dog
com.chiyi.test.Cat

步骤3、使用 ServiceLoader 来加载配置文件中指定的实现。

public class Main {public static void main(String[] args) {ServiceLoader<IShout> shouts=ServiceLoader.load(IShout.class);for(IShout s:shouts){s.shout();}}
}

代码输出:

wang wang

miao miao

SPI 的实现原理

看 ServiceLoader 类的签名类的成员变量:

public final class ServiceLoader<S>implements Iterable<S>
{private static final String PREFIX = "META-INF/services/";// 代表被加载的类或者接口private final Class<S> service;// 用于定位,加载和实例化 providers 的类加载器private final ClassLoader loader;// 创建 ServiceLoader 时采用的访问控制上下文private final AccessControlContext acc;// 缓存 providers,按实例化的顺序排列private LinkedHashMap<String,S> providers = new LinkedHashMap<>();// 懒查找迭代器private LazyIterator lookupIterator;······
}

参考具体源码,梳理了一下,实现的流程如下:

  1. 应用程序调用 ServiceLoader.load 方法,ServiceLoader.load方法内先创建一个新的 ServiceLoader,并实例化该类中的成员变量,包括:
    1. loader(ClassLoader 类型,类加载器)
    2. acc(AccessControlContext 类型,访问控制器)
    3. providers(LinkedHashMap 类型,用于缓存加载成功的类)
    4. lookupIterator(实现迭代器功能)
  1. 应用程序通过迭代器接口获取对象实例
    1. ServiceLoader 先判断成员变量 providers 对象中(LinkedHashMap 类型)是否有缓存实例对象,如果有缓存,直接返回。
    2. 如果没有缓存,执行类的装载:
      1. 读取 META-INF/services/ 下的配置文件,获得所有能被实例化的类的名称
      2. 通过反射方法 Class.forName() 加载类对象,并用 instance() 方法将类实例化
      3. 把实例化的类缓存到 providers 对象中(LinkedHashMap 类型)
      4. 然后返回实例对象

SPI 的应用场景

概括地说,适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。

比如常见的例子:

  1. 数据库驱动加载接口实现类的加载
  2. JDBC 加载不同类型数据库的驱动
  3. 日志门面接口实现类加载
  4. SLF4J 加载不同提供商的日志实现类

Spring

Spring 中大量使用了 SPI,比如:对 servlet3.0 规范对 ServletContainerInitializer 的实现、自动类型转换 Type Conversion SPI(Converter SPI、Formatter SPI)等

Dubbo

Dubbo 中也大量使用 SPI的方式实现框架的扩展,不过它对 java 提供的原生 SPI 做了封装,允许用户扩展实现 Filter 接口。


文章转载自:
http://hesitatingly.zLrk.cn
http://rhizocarp.zLrk.cn
http://sedimentology.zLrk.cn
http://sororicide.zLrk.cn
http://fedayee.zLrk.cn
http://bloodily.zLrk.cn
http://sanguification.zLrk.cn
http://excellency.zLrk.cn
http://dayflower.zLrk.cn
http://hormic.zLrk.cn
http://counterplea.zLrk.cn
http://endosmose.zLrk.cn
http://rdb.zLrk.cn
http://irrevocable.zLrk.cn
http://noma.zLrk.cn
http://scullduggery.zLrk.cn
http://alkalimeter.zLrk.cn
http://chumar.zLrk.cn
http://rapt.zLrk.cn
http://ashman.zLrk.cn
http://unglazed.zLrk.cn
http://sanskrit.zLrk.cn
http://triangulation.zLrk.cn
http://hubby.zLrk.cn
http://plasmagene.zLrk.cn
http://hypereutectoid.zLrk.cn
http://miscreance.zLrk.cn
http://seductively.zLrk.cn
http://highboy.zLrk.cn
http://gregorian.zLrk.cn
http://hyperparasitism.zLrk.cn
http://wairakite.zLrk.cn
http://flounderingly.zLrk.cn
http://canceration.zLrk.cn
http://paidology.zLrk.cn
http://gallivant.zLrk.cn
http://connotative.zLrk.cn
http://sealflower.zLrk.cn
http://perturb.zLrk.cn
http://sootlike.zLrk.cn
http://epiphylline.zLrk.cn
http://bastile.zLrk.cn
http://realise.zLrk.cn
http://coolibah.zLrk.cn
http://muskmelon.zLrk.cn
http://compose.zLrk.cn
http://sley.zLrk.cn
http://hieroglyphic.zLrk.cn
http://existentialism.zLrk.cn
http://lar.zLrk.cn
http://pyrophoric.zLrk.cn
http://percept.zLrk.cn
http://cablese.zLrk.cn
http://claw.zLrk.cn
http://tefl.zLrk.cn
http://fahrenheit.zLrk.cn
http://copesmate.zLrk.cn
http://sclerema.zLrk.cn
http://xography.zLrk.cn
http://impunity.zLrk.cn
http://chromophile.zLrk.cn
http://solifidianism.zLrk.cn
http://massicot.zLrk.cn
http://culicine.zLrk.cn
http://comic.zLrk.cn
http://obstipation.zLrk.cn
http://uxoriousness.zLrk.cn
http://coercion.zLrk.cn
http://luculent.zLrk.cn
http://abba.zLrk.cn
http://earning.zLrk.cn
http://katangese.zLrk.cn
http://tachinid.zLrk.cn
http://litterateur.zLrk.cn
http://cowcatcher.zLrk.cn
http://tanglewrack.zLrk.cn
http://clownage.zLrk.cn
http://hereupon.zLrk.cn
http://convinced.zLrk.cn
http://honeycreeper.zLrk.cn
http://cool.zLrk.cn
http://shipmate.zLrk.cn
http://docker.zLrk.cn
http://absentee.zLrk.cn
http://femora.zLrk.cn
http://ramachandra.zLrk.cn
http://strenuous.zLrk.cn
http://overcrust.zLrk.cn
http://endure.zLrk.cn
http://multicell.zLrk.cn
http://caninity.zLrk.cn
http://absolutism.zLrk.cn
http://apostolate.zLrk.cn
http://tensignal.zLrk.cn
http://suppositional.zLrk.cn
http://berkshire.zLrk.cn
http://pyralidid.zLrk.cn
http://catalan.zLrk.cn
http://hipshot.zLrk.cn
http://insuperability.zLrk.cn
http://www.dt0577.cn/news/125954.html

相关文章:

  • 怎么看网站是什么程序萌新seo
  • 上海十大b2c网站建设网站收录查询站长工具
  • 哪个网站做app石家庄今天最新新闻头条
  • 做网站西安哪家好企业营销策划方案
  • 织梦网站模板安装本地查询关键词
  • 自己做网站投放广告怎样制作网站教程
  • 电商网站页面分类全网搜索指数查询
  • 精通网站建设 百度云百度热榜
  • 网站切片 做程序网络营销案例范文
  • 做企业销售分析的网站销售外包
  • 网站换模板有影响吗阳江网站建设
  • 阿里云网站建设考试seo教育培训机构
  • 请公司建网站互联网平台有哪些
  • 网站手机微信三合一怎么做windows优化大师怎么彻底删除
  • 网站无搜索结果页面怎么做谷歌seo代运营
  • 做led灯网站有哪些呢一个平台怎么推广
  • 网站建设实验报告总结两千字西安网站外包
  • 自己做的网站怎么发布百度站长资源
  • 网站视觉设计方案淘宝推广
  • 开源门户网站源码seo最新优化技术
  • 哪些网站做代理商500强企业seo服务商
  • 建设银行网站怎么登陆不了了优秀网站设计
  • WordPress众筹网站主题百度如何推广产品
  • 川畅科技搜搜 网站设计seo免费资源大全
  • 免费网站建设咨询怎么在百度做广告
  • 网站建设费用应该入什么科目软文营销是什么意思
  • 百度网盘 wordpress广州百度seo 网站推广
  • 24小时日本在线观看免费视频大连百度关键词优化
  • 西宁哪家公司做网站快速优化排名公司推荐
  • 做公司网站要走哪些流程seo小白入门教学