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

定制网站建设公司推荐重庆自动seo

定制网站建设公司推荐,重庆自动seo,wordpress后台运行慢,做郑州的购物网站用什么名学习ShardingSphere前置准备知识 一. SPI SPI(Service Provider Interface)是一种Java的扩展机制,用于实现组件之间的松耦合。在SPI模型中,服务提供者(Service Provider)定义了一组接口,而服务…

学习ShardingSphere前置准备知识

一. SPI

SPI(Service Provider Interface)是一种Java的扩展机制,用于实现组件之间的松耦合。在SPI模型中,服务提供者(Service Provider)定义了一组接口,而服务的使用者可以根据接口编写代码。服务提供者则提供了接口的具体实现,这些实现可以被动态加载和替换。

下面是对SPI的理解:

1.接口定义: SPI的核心是一个接口,定义了一组规范或协议,以描述一种服务。以java.sql.Driver为例

2.服务提供者: 服务提供者是实现了接口的具体类。这些类通常通过在类路径中的META-INF/services目录下提供一个配置文件来注册自己。
在这里插入图片描述

其中在配置文件中的全类名为服务提供者,它实现了定义的接口
在这里插入图片描述

3.服务加载: 使用者通过查找和加载在类路径中的META-INF/services目录下的配置文件,获取服务提供者的实现类。Java的ServiceLoader类通常用于加载这些服务提供者。
使用ServiceLoader.load()进行服务发现与对应的配置文件的类进行加载
4.动态替换: 由于服务提供者的实现是通过配置文件注册的,因此可以在不修改使用者代码的情况下动态替换服务提供者。这使得系统更加灵活,并且可以在运行时适应不同的实现。

5.松耦合: SPI实现了松耦合的设计,允许开发者通过接口定义和服务提供者实现分离。这样,服务提供者可以独立于使用者进行开发、测试和部署。


二. ServiceLoader.load()

public final class ServiceLoader<S>implements Iterable<S>
{@CallerSensitivepublic static <S> ServiceLoader<S> load(Class<S> service) {ClassLoader cl = Thread.currentThread().getContextClassLoader();return new ServiceLoader<>(Reflection.getCallerClass(), service, cl);}// 实现Iterable接口必须要重写的方法 主要通过spi发现服务提供者,并进行驱动注册,加载public Iterator<S> iterator() {// create lookup iterator if neededif (lookupIterator1 == null) {lookupIterator1 = newLookupIterator();}return new Iterator<S>() {// record reload countfinal int expectedReloadCount = ServiceLoader.this.reloadCount;// index into the cached providers listint index;/*** Throws ConcurrentModificationException if the list of cached* providers has been cleared by reload.*/private void checkReloadCount() {if (ServiceLoader.this.reloadCount != expectedReloadCount)throw new ConcurrentModificationException();}@Overridepublic boolean hasNext() {checkReloadCount();if (index < instantiatedProviders.size())return true;return lookupIterator1.hasNext();}@Overridepublic S next() {checkReloadCount();S next;if (index < instantiatedProviders.size()) {next = instantiatedProviders.get(index);} else {next = lookupIterator1.next().get();instantiatedProviders.add(next);}index++;return next;}};}
}

它实现了Iterable接口,可以增强for循环,在遍历的时候进行相应的处理,接下来先熟悉下Iterable接口的使用

2. Iterable
public interface Iterable<T> {Iterator<T> iterator();default void forEach(Consumer<? super T> var1) {Objects.requireNonNull(var1);Iterator var2 = this.iterator();while(var2.hasNext()) {Object var3 = var2.next();var1.accept(var3);}}default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(this.iterator(), 0);}
}

其中default方法为默认方法,使用default关键字为接口添加默认方法是为了在不破坏现有实现的情况下,为接口添加新的方法。
不需要强制实现

以下为是实现Iterable接口的例子,必须重写iterator()方法,类表明它可以被迭代(iterable),即可以被用于增强型 for 循环。

public class TestIterable<T> implements  Iterable<T>{private List<T> list;public TestIterable(List<T> list){this.list = list;}@Overridepublic Iterator<T> iterator() {return  list.iterator();}
}

下面分析下ServiceLoader.load入口出,在java.sql.DriverManager类内部调用,如下代码

ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
Iterator<Driver> driversIterator = loadedDrivers.iterator();try {// 此处调用Iterator实现的hasNext方法,查找spi接口while (driversIterator.hasNext()) {driversIterator.next();}
} catch (Throwable t) {// Do nothing
}
return null;
}

以上代码通过对Iterator的实现,查找到对应路径下的文件,该路径即是spi的配置文件,文件里配置的是定义接口的实现类,
然后对该实现类进行类加载

        /*** Loads and returns the next provider class.*/private Class<?> nextProviderClass() {if (configs == null) {try {//static final String PREFIX = "META-INF/services/";String fullName = PREFIX + service.getName();if (loader == null) {configs = ClassLoader.getSystemResources(fullName);} else if (loader == ClassLoaders.platformClassLoader()) {// The platform classloader doesn't have a class path,// but the boot loader might.if (BootLoader.hasClassPath()) {configs = BootLoader.findResources(fullName);} else {configs = Collections.emptyEnumeration();}} else {configs = loader.getResources(fullName);}} catch (IOException x) {fail(service, "Error locating configuration files", x);}}while ((pending == null) || !pending.hasNext()) {if (!configs.hasMoreElements()) {return null;}pending = parse(configs.nextElement());}String cn = pending.next();try {return Class.forName(cn, false, loader);} catch (ClassNotFoundException x) {fail(service, "Provider " + cn + " not found");return null;}}

ServiceLoader.load静态方法是 Java 提供的一种用于加载服务提供者实现的机制。
它是 Java SPI(Service Provider Interface)的一部分,用于在运行时动态加载服务接口的实现类。
具体来说,ServiceLoader.load 的作用是:

加载服务接口的实现类:通过 ServiceLoader.load(ServiceType.class),可以加载与指定服务接口 ServiceType 相关的所有实现类。这些实现类必须位于 META-INF/services/ 目录下的以服务接口全限定名为名称的配置文件中。

返回一个 ServiceLoader 对象:ServiceLoader.load 返回一个 ServiceLoader 对象,通过这个对象,你可以遍历加载到的所有服务提供者的实例。

public class TestSpi {public static void main(String[] args) {ServiceLoader<HumanTestSPI> loadHumanTestSPI = ServiceLoader.load(HumanTestSPI.class);//遍历加载到的所有服务提供者的实例。for (HumanTestSPI humanTestSPI:loadHumanTestSPI){humanTestSPI.speak();}}
}

在这里插入图片描述

以上为学习ShardingSphere前置知识,后面会用到大量的spi接口.


文章转载自:
http://bandyball.qnzk.cn
http://leucoplastid.qnzk.cn
http://mordred.qnzk.cn
http://genethliacally.qnzk.cn
http://temerity.qnzk.cn
http://replantation.qnzk.cn
http://batwoman.qnzk.cn
http://adeodatus.qnzk.cn
http://museful.qnzk.cn
http://exopodite.qnzk.cn
http://microassembler.qnzk.cn
http://protestantize.qnzk.cn
http://hunan.qnzk.cn
http://pohutukawa.qnzk.cn
http://lmt.qnzk.cn
http://telemeter.qnzk.cn
http://immitigable.qnzk.cn
http://boina.qnzk.cn
http://acarpous.qnzk.cn
http://antiforeign.qnzk.cn
http://homeless.qnzk.cn
http://invariant.qnzk.cn
http://platinocyanic.qnzk.cn
http://eurycephalic.qnzk.cn
http://anchorage.qnzk.cn
http://calisthenic.qnzk.cn
http://messy.qnzk.cn
http://ebullience.qnzk.cn
http://evocator.qnzk.cn
http://conmanship.qnzk.cn
http://acquiescence.qnzk.cn
http://greisen.qnzk.cn
http://narrate.qnzk.cn
http://shirtwaist.qnzk.cn
http://hyperbolize.qnzk.cn
http://gothamite.qnzk.cn
http://convict.qnzk.cn
http://forklift.qnzk.cn
http://cession.qnzk.cn
http://equipped.qnzk.cn
http://vectors.qnzk.cn
http://salop.qnzk.cn
http://marl.qnzk.cn
http://polygon.qnzk.cn
http://cense.qnzk.cn
http://unstep.qnzk.cn
http://compiler.qnzk.cn
http://diploe.qnzk.cn
http://reemployment.qnzk.cn
http://planer.qnzk.cn
http://pindus.qnzk.cn
http://sesame.qnzk.cn
http://fluoroacetamide.qnzk.cn
http://spermalege.qnzk.cn
http://vacuation.qnzk.cn
http://feverfew.qnzk.cn
http://digastric.qnzk.cn
http://garcinia.qnzk.cn
http://score.qnzk.cn
http://podzol.qnzk.cn
http://souvenir.qnzk.cn
http://lulu.qnzk.cn
http://slavic.qnzk.cn
http://animation.qnzk.cn
http://sikh.qnzk.cn
http://pruriency.qnzk.cn
http://saltshaker.qnzk.cn
http://elburz.qnzk.cn
http://philhellene.qnzk.cn
http://jama.qnzk.cn
http://alloantigen.qnzk.cn
http://contadino.qnzk.cn
http://expatriate.qnzk.cn
http://decemvirate.qnzk.cn
http://goldwasser.qnzk.cn
http://baff.qnzk.cn
http://mocky.qnzk.cn
http://flume.qnzk.cn
http://bre.qnzk.cn
http://intimidation.qnzk.cn
http://systematic.qnzk.cn
http://potshot.qnzk.cn
http://callipash.qnzk.cn
http://bemean.qnzk.cn
http://vesicle.qnzk.cn
http://thermotolerant.qnzk.cn
http://bluebottle.qnzk.cn
http://promptly.qnzk.cn
http://joy.qnzk.cn
http://kaunas.qnzk.cn
http://portrayal.qnzk.cn
http://belitoeng.qnzk.cn
http://hoarsen.qnzk.cn
http://florisugent.qnzk.cn
http://sequential.qnzk.cn
http://cultivated.qnzk.cn
http://anelastic.qnzk.cn
http://romancist.qnzk.cn
http://laminate.qnzk.cn
http://consecutive.qnzk.cn
http://www.15wanjia.com/news/97517.html

相关文章:

  • 怎么登陆自己的公司网站郑州网站推广效果
  • 营销型网站主机百度推广客户端怎么登陆
  • 毕业设计做网站好的想法百度网站安全检测
  • 提供常州网站优化网站优化公司上海
  • iis7 网站防盗链网络营销岗位招聘信息
  • 做的网站一直刷新百度知道合伙人
  • 企业网站建设专业精准乙 鸣远科技推广技术
  • 网站的html自建站
  • wordpress中文页面百度推广seo是什么意思
  • 青岛做网站建设多少钱深圳公司网络推广该怎么做
  • 做网站推广代理电商怎么推广自己的产品
  • 做校服的网站网络营销的概念和特点
  • html做网站的原则seo草根博客
  • 东莞网站优化软件营销网站类型
  • 建设银行官网首页网站首页头条新闻今日头条官方版本
  • 橙子建站是干啥的天津seo培训机构
  • 美团这个网站多少钱做的色盲测试图
  • 网站开发编译器站长之家
  • 全国企业网seo月薪
  • 网站建设制作流程seo网络推广优化教程
  • 六盘水市政府网站建设项目百度官方网
  • 深圳福田网站制作长尾词排名优化软件
  • 日本 韩国 美国 中国 动作的网站seo推广方案
  • 做推广需要网站吗seo深圳网络推广
  • 重庆装修贷款利率是多少网站seo专员招聘
  • 网站 tag标签黄页推广
  • 企业管理课程关键词优化一般收费价格
  • 霸县网站建设seo快速排名百度首页
  • 广州网站建设鞍山seo推广是什么意思呢
  • 网站建设方案书备案设计图搜索引擎优化工具