电子商务网站建设方面的论文市场营销策略模板

news/2025/9/23 2:42:13/文章来源:
电子商务网站建设方面的论文,市场营销策略模板,常德网站建设开发哪家好,做网络销售如何找客户文章目录 前言ClassLoaderJAVA SPI机制Spring SPI机制示例原理 如何加载jar包里的class 前言 Java的SPI机制与Spring中的SPI机制是如何实现的#xff1f; ClassLoader 这里涉及到了class Loader的机制#xff0c;有些复杂#xff0c;jdk中提供默认3个class Loader#x… 文章目录 前言ClassLoaderJAVA SPI机制Spring SPI机制示例原理 如何加载jar包里的class 前言 Java的SPI机制与Spring中的SPI机制是如何实现的 ClassLoader 这里涉及到了class Loader的机制有些复杂jdk中提供默认3个class Loader Bootstrap ClassLoader加载jdk核心类库加载%JAVA_HOME\lib%下的jarExtClassLoader加载jdk扩展类库加载%JAVA_HOME\lib\ext%下的jarAppClassLoader加载classpath下的class以及关联到maven仓库里的jar AppClassLoader和ExtClassLoader父类都是URLClassLoader我们自定义也是继承URLClassLoader进行扩展的 所以当我们使用类加载器加载资源时它会找上面这些路径而AppClassLoader是找当前执行程序的classpath也就是我们target/classes目录如果有是maven引用了其他依赖包那么也会将maven地址下的依赖包的路径加到AppClassLoader的URL里如果是多模块的项目还会把引用的其他模块下target/classes的目录也加进来。 JAVA SPI机制 Java中提供的SPI机制是通过读取META-INF/services/目录下的接口文件从而加载到实现类。 其规则如下 规定号开放api实现提供方需要依赖开发接口完成实现例如msyql实现提供方resource下提供META-INF/services/接口全名文件内容为实现类 例如下面这个 重现建一个项目app用来测试 定义接口plugin-api打成jar包 /*** author ALI* since 2023/6/30*/ public interface Plugin {Object run(Object data); } 定义实现然后打成jar包 /*** author ALI* since 2023/6/30*/ public class PluginImpl implements Plugin {Overridepublic Object run(Object data) {Motest motest new Motest();System.out.println(motest.getName());System.out.println(data);return null;} }/*** author ALI* since 2023/6/30*/ public class Motest {private String name;public Motest() {name sss;}public String getName() {return name;} } 这里我还定义了一个其他的类用来测试再load class时是否会加载。 在新项目中加载jar中的资源引入plugin-api /*** 使用jar的classLoader*/private static void load2() throws Exception{String jarPath E:/workspace/git/test-plugin/app/target/classes/plugin-impl-1.0-SNAPSHOT.jar;URLClassLoader jarUrlClassLoader new URLClassLoader(new URL[]{new URL(file: jarPath)});// ServerLoader搜索ServiceLoaderPlugin load ServiceLoader.load(Plugin.class, jarUrlClassLoader);IteratorPlugin iterator load.iterator();while (iterator.hasNext()) {// 实例化对象这里会进行加载Class.forName然后反射实例化Plugin next iterator.next();next.run(sdsdsdsds);}}这里使用ServiceLoader时传入了jarClassLoader开篇已经解释过了因为类加载器的原因不会加载我们自定义的jar包所以手动创建类加载器。 结果已经很显而易见已经成功加载了这种方式的划会加载jar包里实现了接口的所有实现类这个方式使用也是很方便的。 使用URLClassLoader加载class Spring SPI机制 在Spring中它的SPI机制和JAVA 中的类似需要这样的条件 定义接口模块包用于开发给第三方实现 第三方要有resources\META-INF\spring.factories文件其内容是键值对方式key为接口类value就是我们的实现类 而Spring执行就是获取到文件里的value然后反射实例化。 示例 定义接口模块 定义第三方实现组件并配置spring.factoryies 项目中引入接口模块组件和实现组件 结果 原理 loadFactories两个参数 Class factoryType用于反射实例化 ClassLoader classLoader用于加载资源所有这里可以直接使用URLClassLoader指定jar的类加载如果不指定就是它自己本身的类加载 public static T ListT loadFactories(ClassT factoryType, Nullable ClassLoader classLoader) {Assert.notNull(factoryType, factoryType must not be null);ClassLoader classLoaderToUse classLoader;if (classLoaderToUse null) {// 如果为空它用自己的加载器classLoaderToUse SpringFactoriesLoader.class.getClassLoader();}// 这里就是加载spring.factories文件里的value值// 找出所有的实现类的类路径ListString factoryImplementationNames loadFactoryNames(factoryType, classLoaderToUse);if (logger.isTraceEnabled()) {logger.trace(Loaded [ factoryType.getName() ] names: factoryImplementationNames);}ListT result new ArrayList(factoryImplementationNames.size());// 遍历找出来的类然后通过反射实例化for (String factoryImplementationName : factoryImplementationNames) {result.add(instantiateFactory(factoryImplementationName, factoryType, classLoaderToUse));}// 排序AnnotationAwareOrderComparator.sort(result);return result;} 这里看一下 public static ListString loadFactoryNames(Class? factoryType, Nullable ClassLoader classLoader) {// 将接口类转化成类路径如com.liry.pluginapi.PluginString factoryTypeName factoryType.getName();// 先获取到spring.factories里的键值对map,然后再getreturn loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());}private static MapString, ListString loadSpringFactories(Nullable ClassLoader classLoader) {// 缓存程序运行中需要多次获取MultiValueMapString, String result cache.get(classLoader);if (result ! null) {return result;}try {// 通过类加载获取所有资源地址urlEnumerationURL urls (classLoader ! null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));result new LinkedMultiValueMap();// 遍历while (urls.hasMoreElements()) {URL url urls.nextElement();UrlResource resource new UrlResource(url);// 通过PropertiesLoaderUtils工具获取spring.factories里的键值对Properties properties PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry?, ? entry : properties.entrySet()) {String factoryTypeName ((String) entry.getKey()).trim();// 将value通过逗号分隔成数组然后再全部添加到结果集中for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {result.add(factoryTypeName, factoryImplementationName.trim());}}}// 加入缓存cache.put(classLoader, result);return result;}catch (IOException ex) {throw new IllegalArgumentException(Unable to load factories from location [ FACTORIES_RESOURCE_LOCATION ], ex);}} 注意MultiValueMap这个map相同的key不会覆盖value而是组成链表如下一个key可以有多个value逗号分隔 public void add(K key, Nullable V value) {ListV values this.targetMap.computeIfAbsent(key, k - new LinkedList());values.add(value);}如何加载jar包里的class 假设需要获取一个jar包里的class该如何 如下4个步骤即可 public static void main(String[] args) throws Exception {String packageName com.liry.springplugin;// 1. 转换为 com/liry/springpluginString packagePath ClassUtils.convertClassNameToResourcePath(packageName);// 2. 通过类加载器加载jar包URL // ClassLoader classLoader Test.class.getClassLoader();ClassLoader classLoader new URLClassLoader(new URL[]{new URL(file:E:\\workspace\\git\\test-plugin\\spring-plugin\\target\\spring-plugin-1.0-SNAPSHOT.jar)});URL resources classLoader.getResource(packagePath);// 3. 打开资源通道JarFile jarFile null;URLConnection urlConnection resources.openConnection();if (urlConnection instanceof java.net.JarURLConnection) {java.net.JarURLConnection jarURLConnection (java.net.JarURLConnection) urlConnection;jarFile jarURLConnection.getJarFile();}// 定义一个结果集ListString resultClasses new ArrayList();// 4. 遍历资源文件EnumerationJarEntry entries jarFile.entries();while (entries.hasMoreElements()) {JarEntry entry entries.nextElement();// 文件全路径String path entry.getName();// 判断是否在指定包路径下jar包里有多层目录、MF文件、class文件等多种文件信息if (path.startsWith(packagePath)) {// 使用spring的路径匹配器匹配class文件if (path.endsWith(.class)) {resultClasses.add(path);}}}resultClasses.forEach(System.out::println);}说明一下加载jar包的问题 上面给出了两种方式 第一种使用类加载加载 ClassLoader classLoader Test.class.getClassLoader();第二种使用URLClassLoader加载 ClassLoader classLoader new URLClassLoader(new URL[]{new URL(file:E:\\workspace\\git\\test-plugin\\spring-plugin\\target\\spring-plugin-1.0-SNAPSHOT.jar)});这两种方式不同之处在于查找jar的路径第一种方式因为我测试项目使用的maven在pom.xml里引入了spring-plugin-1.0-SNAPSHOT的包所以才能通过类加载器直接进行加载这是因为使用mavenmaven引用的依赖路径会被加入到AppClassLoader种然后使用Test.class.getClassLoader()去加载class时会委派给AppClassLoader进行加载才会加载到。 所以如果不是在maven种引入的包使用第二种方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英文网站建设方案模板高校seo优化的常用手法

登入的角色本身属于领导级别(集团权限),没有下级的不同权限: 切换不同身份(公司),以获得相应部门的不同导航菜单及权限 这里实现:更改角色权限后,实现页面 不刷新 更改…

新泰网站定制郑州专业的建网站

对象指针 实验介绍 本节实验专门介绍对象指针相关内容。指针是一把双刃剑,用好了非常顺手使用,但同时也好要小心使用指针。指针是 C/C++ 语言的特点,只有掌握好指针才能学习到精髓。 知识点 对象指针对象成员指针this 指针对象指针 在前面的实验中已经使用过对象指针,本…

昆山商城网站建设公司名高端大气不重名

APache Dubbo简介 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式…

网站建设数据库实训体会定制化软件

绪论 1)信息,消息,信号通信:利用电(或者光)信号传输消息中所包含的信息。信息:消息的内涵。 消息:信息的物理表现形式。(可分为两类连续消息语音,音乐&#x…

网页建站总结报告不一样的婚恋网站怎么做

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 输入:8 输出:7 用list实现循环遍历的过程 import copy a[1,2,3,4…

中国免费建设网站网址做棋牌网站违法吗

说明 在 Synopsys* VCS* 和 VCS* MX 仿真器中模拟由以下位置生成的 Nios V 处理器系统时,可能会出现该问题: 英特尔 Quartus Prime Pro Edition 软件版本 23.1 至 23.4,或 英特尔 Quartus Prime Standard Edition 软件版本 23.1std 这是由…

网站建设中的英文单词如何用手机制作网页链接

在Python中,浮点数是一种用于表示带有小数部分的数值类型。浮点数可以用来进行各种数学运算,包括加法、减法、乘法和除法等。 以下是Python中使用浮点数的语法示例: # 声明一个浮点数变量number 3.14# 进行浮点数之间的运算a 2.5b 1.3c a…

如何建 网站邵阳经开区网站

在JavaScript中,数据类型是编程中非常重要的概念,它决定了数据的性质、如何存储以及如何操作这些数据。以下是JavaScript中的主要数据类型、它们的区别以及数据类型检测的方式的详细介绍。 JavaScript的主要数据类型 1. 原始数据类型(Primi…

企业网站优化报价怎么给网站 做排名

XSLVGL2.0 开发手册 【XSLVGL2.0】如何在其它线程内更新UI 1、概述2、UI资源锁锁死怎么办?1、概述 项目常常会在其它线程更新UI的状态,但如果直接更新UI会导致UI数据异常从而使得UI挂死。这时只需要使用UI资源锁即可保证UI数据不会异常了。 参考XSLVGL2.0 User Manual 页面…

房地产市场发展趋势成都百度推广账户优化

介绍:在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式。它解决的仍然是软件设计中与创建对象有关的问题。它可以更好的处理客户的需求变化。引入我们继续来说"new&q…

网站开发需要的资料微信开发在哪能看

中午好,我的网工朋友。 都放假了没?龙年将至,都有啥新年计划? 过年,讲究的就是一个热闹,可以暂时告别辛苦的一年,重新整装出发。 热闹可少不了春联啊,红红火火又一年,…

福州整站优化企业网站页面设计

目录 前言引言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客,在读者的反馈中发现许多小伙伴对方言…

西安咪豆网站建设公司php网站开发实例视频教程

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

网站运营经验分享ppt模板个人网页设计与制作教程

intersect组件是解决纵向联邦学习中的隐私求交问题 fate隐私求交的方式有三种:raw,rsa,dh。raw方式不安全,rsa和dh方式是安全的,dh是基于对称加密的安全交集 rsa是基于RSA(非对称加密)的安全交集,,dh方法也用于安全的…

建个网站有什么用营销渠道有哪些

Renderer2 类 Renderer2 类是 Angular 提供的一个抽象服务,允许在不直接操作 DOM 的情况下操纵应用程序的元素。这是推荐的方法,因为它使得更容易开发可以在没有 DOM 访问权限的环境中渲染的应用程序,比如在服务器上、在 Web Worker 中或在原…

最好的网站设计公司源码 php桂林市区好玩的地方

随着信息化时代的到来,煤矿行业也迎来了前所未有的机遇与挑战。在这个充满活力和竞争的领域,技术的革新对于提高生产效率、保障安全生产至关重要。而随着时间敏感网络(TSN)技术的不断发展,TSN工业交换机作为其关键组成…

无锡制作网站价格黄页88企业名录

使用社区版,您可以在本地服务器上安装 ONLYOFFICE 文档,并将在线编辑器与 ONLYOFFICE 协作平台或其他热门系统集成在一起。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写…

免费试用网站有哪些网上网络推广

系列文章目录 文章目录 系列文章目录前言一、UR5 URDF 代码二、base_link三、shoulder_pan_joint四、shoulder_pan_trans五、ROS base_link 坐标系到 UR 机器人 Base 坐标系的转换六、与全零TCP&#xff08;工具坐标系&#xff09;重合的工具链接 前言 一、UR5 URDF 代码 <…

做微信的微网站费用多少c 网站建设设计报告

Autofac.Annotation框架是我用.netcore写的一个DI框架&#xff0c;基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址&#xff1a;https://github.com/yuzd/Autofac.Annotation本期讲的是最新实现的功能有条件的DI有些时候我们想…

喀什网站制作阿里巴巴对外做网站吗

摘要&#xff1a; 容器开启数据服务之旅系列&#xff08;二&#xff09;&#xff1a;Kubernetes如何助力Spark大数据分析 &#xff08;二&#xff09;&#xff1a;Kubernetes如何助力Spark大数据分析 概述 本文为大家介绍一种容器化的数据服务Spark OSS on ACK&#xff0c;允许…