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

成都高度网站技术建设公司网站开发项目挣钱吗

成都高度网站技术建设公司,网站开发项目挣钱吗,网页图片不显示是什么原因,网站开发工具的功能包括哪些转载:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少听过spi#xff0c;具体的解释我就不多说了。但是它具体是怎么实现的呢#xff1f;它的原理是什么呢#xff1f;下面我就围绕这两个问题来解释#xff1a;实现: 其实具体的实现类就是java.util.ServiceLoader…转载:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少听过spi具体的解释我就不多说了。但是它具体是怎么实现的呢它的原理是什么呢下面我就围绕这两个问题来解释实现: 其实具体的实现类就是java.util.ServiceLoader这个类。要想了解一个机制的原理首先得知道它是怎么运行的需要什么配置才能运行起来。然后再分解来了解实现。对于技术实现也是一样先看这个类是怎么实现的先让它跑起来看到效果。然后再讲原理。按照使用说明文档应该分下面几个步骤来使用创建一个接口文件在resources资源目录下创建META-INF/services文件夹在services文件夹中创建文件以接口全名命名创建接口实现类我们想测试一下一般是在这个工程中建立一个测试类来测试。来看下代码片段接口类public interfaceIMyServiceLoader {String sayHello();String getName();}View Code实现类public class MyServiceLoaderImpl1 implementsIMyServiceLoader {OverridepublicString sayHello() {return hello1;}OverridepublicString getName() {return name1;}}public class MyServiceLoaderImpl2 implementsIMyServiceLoader {OverridepublicString sayHello() {return hello2;}OverridepublicString getName() {return name2;}}View Code测试类public classTestMyServiceLoader {public static voidmain(String[] argus){ServiceLoader serviceLoader ServiceLoader.load(IMyServiceLoader.class);for(IMyServiceLoader myServiceLoader : serviceLoader){System.out.println(myServiceLoader.getName()myServiceLoader.sayHello());}}}View Code正常情况下这里应该输出name2hello2name1hello1View Code看了这些步骤想必你也知道原理了我在这里总结下。原理在ServiceLoader.load的时候根据传入的接口类遍历META-INF/services目录下的以该类命名的文件中的所有类并实例化返回。相信看到这里有的看客该爆粗话了说啥子看着一篇就够了这些知识点随便一搜到处都是好伐。是的上面说的确实随便一搜都可以搜到所以这里我要划重点了一、问题上面说了正常情况下会那样输出但是你运行程序你就会发现马丹怎么不起作用啊我哪里做错了都是按照文章步骤来做的。弄的你都开始怀疑人生了。不要怀疑人生在一个工程中做测试确实不能实现想要的效果。二、回忆场景回忆一下spi的使用场景。它是给制作标准的一放用的用来指定标准然后不同实现方用不同的方式实现标准供使用方使用。那标准方和实现方必然不是一个。想到这里你应该能够向明白了吧。三、解决方案要解决问题就把之前做的打jar包引入新工程测试这样就可以了。四、疑问但是有人会说标准方和实现方也可能是一个啊好比标准方我提供一个内部的实现方案也是可以的啊。也确实有道理啊那这种怎么实现呢五、思考当然也有办法下面就说下实现方法。想要实现上面的需求首先要知道拦阻这个需求实现的问题然后把这些问题都解决了需求自然也就实现了。那就先来分析问题吧为什么在一个工程中获取不到接口的实现类呢经过观察发现是因为资源文件没有在classPath中为什么这么说呢可以看下build的目录下面是没有META-INF文件夹。现在知道了原因这么解决呢六、疑问临时解决方案最简单的方法把资源下的META-INF文件夹拷贝到build目录下然后再运行发现可以了这也就验证了确实是这个问题造成的。搞定七、再次发出疑问这样就结束了那我总不能手动拷贝吧这不算解决方案只是临时方案。那要怎么解决呢我就不卖关子了。其实要解决这个问题只要在编译的时候把这些文件放到build目录中就行了是不是很简单。思路是有了可是怎么实现呢这个时候要用到拦截编译处理然后再里面做这件事情。方案一继承AbsStractProcessor在process方法中把资源文件移到build目录下。方案二这里用到了google开源的AutoService大概看了下autoService的源码其实它也是使用方案一的方法拦截编译过程然后再build目录下生成配置文件这里来大概看下它的process方法ublic boolean process(Set extends TypeElementannotations, RoundEnvironment roundEnv) {try{returnprocessImpl(annotations, roundEnv);}catch(Exception e) {...return true;}}private boolean processImpl(Set extends TypeElementannotations, RoundEnvironment roundEnv) {if(roundEnv.processingOver()) {generateConfigFiles();}else{processAnnotations(annotations, roundEnv);}return true;}View Code这里你会发现其实就是generateConfigFiles()和processAnnotations(annotations, roundEnv)看名字可以猜到processAnnotations是处理注解的这里实现类都实现了注解所以这里应该是找到实现类。rivate void processAnnotations(Set extends TypeElementannotations,RoundEnvironment roundEnv) {Set extends Element elements roundEnv.getElementsAnnotatedWith(AutoService.class);for(Element e : elements) {TypeElement providerImplementer(TypeElement) e;AnnotationMirror providerAnnotation getAnnotationMirror(e, AutoService.class).get();DeclaredType providerInterfacegetProviderInterface(providerAnnotation);TypeElement providerType(TypeElement) providerInterface.asElement();...String providerTypeNamegetBinaryName(providerType);String providerImplementerNamegetBinaryName(providerImplementer);providers.put(providerTypeName, providerImplementerName);}}View Code确实如此这里会把所有的实现类存起来。再来看看generateConfigFiles()方法private voidgenerateConfigFiles() {Filer filerprocessingEnv.getFiler();for(String providerInterface : providers.keySet()) {String resourceFile META-INF/services/ providerInterface;try{SortedSet allServices Sets.newTreeSet();try{FileObject existingFile filer.getResource(StandardLocation.CLASS_OUTPUT, ,resourceFile);Set oldServices ServicesFiles.readServiceFile(existingFile.openInputStream());allServices.addAll(oldServices);}catch(IOException e) {}Set newServices new HashSet(providers.get(providerInterface));allServices.addAll(newServices);FileObject fileObject filer.createResource(StandardLocation.CLASS_OUTPUT, ,resourceFile);OutputStream outfileObject.openOutputStream();ServicesFiles.writeServiceFile(allServices, out);out.close();}catch(IOException e) {return;}}}View Code这里是在build下创建META-INF目录。和我们想的一模一样。八、总结好了要实现文章开头的需求除非你觉得你比google开源AutoService的工程师写的更好不然就直接使用AutoService吧。这篇文章不仅是分析ServiceLoader的原理实现我们的需求更重要的是高速我们遇到问题该怎么分析问题解决问题。九、扩展其实还有很多比较好玩的比如在拦截到编译过程时可以再编译期生成一些有意思的代码来帮我们实现一些自动化处理。这就需要动用我们的大脑就想了介绍一下生成代码的库javapoet大家可以了解一下。
http://www.huolong8.cn/news/363671/

相关文章:

  • 网页制作与网站建设完全学习手册pdf在网站怎么做代销
  • 手机网页打不开是什么原因seo网站推广是什么
  • 做以个一元购的网站多少钱深圳做网站推荐哪家公司
  • 外贸平台哪个网站最好知乎做什么网站好
  • 上海建设工程学校东营网站seo顾问
  • 广告机自建站模板wordpress 关键词设置
  • 济南智能网站建设流程装宽带需要多少钱一个月
  • 西安模板网站建设套餐wap网站优化
  • 郑州做网站便宜写论文的好网站
  • 广州网站建设类岗位聊城有限公司网站建设 中企动力济二分
  • 最便宜的购物网站排名wap网站建设好不好
  • 网站上传模板后网页录制视频教程
  • 做网站不知道做什么内容的国外做无纺布的网站
  • 做水果网站首页的图片素材自己网站做电子签章有效么
  • 高校两学一做网站建设如何用魔方网表做门户网站
  • 成华区微信网站建设公司怎么做网站填内容
  • 深圳网站建设服务哪家简述企业建网站的步骤
  • 会网站建设好吗手机端企业网站源码
  • 长沙做网站报价设计网站费用
  • 做网站的启蒙思想wordpress hierarchy
  • 网站开发设计注册湛江城市建设培训中心网站
  • 揭阳企业自助建站系统开网站成本
  • 大数据网站开发工程师关于建设网站的培训知识
  • 小企业网站欣赏厦门网站设计排行
  • 广东省建设工程安监局网站wordpress团购模板
  • 深圳网站多少钱一年无代码开发是什么
  • 响应式网站建设 苏州网站 404 错误页面是否自动跳转
  • 南昌网站建设大全网站本地化怎么做
  • 深圳高端网站建设公司天津网站建设品牌推广
  • 6东莞做网站在线安装wordpress