ae模板下载网站推荐企业网站如何设计网页

diannao/2025/10/13 16:40:12/文章来源:
ae模板下载网站推荐,企业网站如何设计网页,免费的行情网站,wordpress 主页位置转载自 jar包天天见#xff0c;可是你知道它的运行机制吗 今天介绍两个大家每天都在用但是却很少去了解它的知识点#xff1a;spi 和 jar 运行机制#xff0c;废话不多说#xff0c;开始正题。 spi spi 是 Java 提供的一套用来被第三方实现或者扩展的 API #xff0c;…转载自  jar包天天见可是你知道它的运行机制吗 今天介绍两个大家每天都在用但是却很少去了解它的知识点spi 和 jar 运行机制废话不多说开始正题。 spi spi 是 Java 提供的一套用来被第三方实现或者扩展的 API 它可以用来启用框架扩展和替换组件。spi 机制是这样的读取 META-INF/services/ 目录下的元信息然后 ServiceLoader 根据信息加载对应的类你可以在自己的代码中使用这个被加载的类。要使用 Java SPI需要遵循如下约定 当服务提供者提供了接口的一种具体实现后在 jar 包的 META-INF/services 目录下创建一个以 “接口全限定名” 命名的文件内容为实现类的全限定名 接口实现类所在的 jar 包放在主程序的 classpath 中 主程序通过 java.util.ServiceLoder 动态装载实现模块它通过扫描 META-INF/services 目录下的配置文件找到实现类的全限定名把类加载到 JVM SPI 的实现类必须携带一个不带参数的构造方法 现在我们来简单的使用一下吧。 spi 使用示例 建一个 maven 项目定义一个接口 ( com.test.SpiTest )并实现该接口 com.test.SpiTestImpl然后在 src/main/resources/ 下建立 /META-INF/services 目录 新增一个以接口命名的文件 ( com.test.SpiTest)内容是要应用的实现类 com.test.SpiTestImpl。 public interface SpiTest {void test();}public class SpiTestImpl implements SpiTest {Overridepublic void test() {System.out.println(test);}} 然后在我们的应用程序中使用 ServiceLoader来加载配置文件中指定的实现。 public static void main(String[] args) {ServiceLoaderSpiTest load ServiceLoader.load(SpiTest.class);SpiTest next load.iterator().next();next.test();} 这便是 spi 的使用方式了简约而不简单。 spi 技术的应用 那这一项技术有哪些方面的应用呢最直接的 jdbc 中我们需要指定数据库驱动的全限定名这便是 spi 技术。还有不少框架比如 dubbo 都会预留 spi 扩展点比如dubbo spi 为什么要这么做呢在 Spring 框架中我们注入一个 bean 很容易通过注解或者 xml 配置即可然后在其他的地方就能使用这个 bean 。在非 Spring 框架下我们想要有同样的效果就可以考虑 spi 技术了。 写过 SpringBoot 的 starter 的都知道需要在 src/main/resources/ 下建立 /META-INF/spring.factories 文件。这其实也是一种spi技术的变形。 jar 机制 通常项目中我们打 jar 包都是通过 maven 来进行的导致很多人忽略了这个东西的存在就像很多人不知道 jdb.exe 是啥玩意一样。下面我们不借助任何工具来打一个 jar 包并对 jar 文件结构进行解析。 命令行打 jar 包 首先我们建立一个普通的 java 项目新建几个 class 类然后在根目录下新建 META-INF/MAINFEST.MF这个文件包含了 jar 的元信息当我们执行 java -jar 的时候首先会读取该文件的信息做相关的处理。我们来看看这个文件中可以配置哪些信息 Manifest-Version用来定义 manifest 文件的版本例如Manifest-Version: 1.0 Main-Class定义 jar 文件的入口类该类必须是一个可执行的类一旦定义了该属性即可通过 java -jar x.jar 来运行该 jar 文件。 Class-Path指定该 jar 包所依赖的外部 jar 包以当前 jar 包所在的位置为相对路径无法指定 jar 包内部的 jar 包 签名相关属性包括 Name Digest-Algorithms SHA-Digest 等 定义好元信息之后我们就可以打 jar 包了以下是打包的一些常用命令 默认打包 生成的test.jar中就含test目录和jar自动生成的META-INF目录内含MAINFEST.MF清单文件 jar -cvf test.jar test 查看包内容 jar -tvf test.jar 解压jar包 jar -xvf test.jar 提取jar包部分内容 jar -xvf test.jar test\test.class 追加内容到jar包 追加 MAINFEST.MF 清单文件以外的文件会追加整个目录结构 jar -uvf test.jar other\ss.class 追加清单文件 会追加整个目录结构( test.jar 会包含 META-INF 目录) jar -uMvf test.jar META-INF\MAINFEST.MF 创建自定义MAINFEST.MF的jar包 jar -cMvf test.jar test META-INF 通过 -m 选项配置自定义 MAINFEST.MF 文件时自定义MAINFEST.MF 文件必须在位于工作目录下才可以 jar -cmvf MAINFEST.MF test.jar test jar 运行的过程 jar 运行过程和类加载机制有关而类加载机制又和我们自定义的类加载器有关现在我们先来了解一下双亲委派模式。 java 中类加载器分为三个 BootstrapClassLoader 负责加载 ${JAVA_HOME}/jre/lib 部分 jar 包 ExtClassLoader 加载 ${JAVA_HOME}/jre/lib/ext 下面的 jar 包 AppClassLoader 加载用户自定义 -classpath 或者 Jar 包的 Class-Path 定义的第三方包 类的生命周期为加载Loading、验证Verification、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading)七个阶段。 当我们执行 java -jar 的时候 jar 文件以二进制流的形式被读取到内存但不会加载到 jvm 中类会在一个合适的时机加载到虚拟机中。类加载的时机 遇到 new、getstatic、putstatic 或 invokestatic 这四条字节码指令时如果类没有进行过初始化则需要先对其进行初始化。这四条指令的最常见的 Java 代码场景是使用 new 关键字实例化对象的时候读取或设置一个类的静态字段调用一个类的静态方法的时候。 使用 java.lang.reflect 包的方法对类进行反射调用的时候如果类没有进行过初始化则需要先触发其初始化。 当初始化一个类的时候如果发现其父类还没有进行过初始化则需要先触发其父类的初始化。 当虚拟机启动时用户需要指定一个要执行的主类包含 main() 方法的那个类虚拟机会先初始化这个主类。 当触发类加载的时候类加载器也不是直接加载这个类。首先交给 AppClassLoader 它会查看自己有没有加载过这个类如果有直接拿出来无须再次加载如果没有就将加载任务传递给 ExtClassLoader 而 ExtClassLoader 也会先检查自己有没有加载过没有又会将任务传递给 BootstrapClassLoader 最后 BootstrapClassLoader 会检查自己有没有加载过这个类如果没有就会去自己要寻找的区域去寻找这个类如果找不到又将任务传递给 ExtClassLoader 以此类推最后才是 AppClassLoader 加载我们的类。这样做是确保类只会被加载一次。通常我们的类加载器只识别 classpath 这里的 classpath 指项目根路径也就是 jar 包内的位置下 .class 文件。jar 中其他的文件包括 jar 包被当做了资源文件而不会去读取里面的 .class 文件。但实际上我们可以通过自定义类加载器来实现一些特别的操作 Tomcat 的类加载器 Tomcat 的类加载机制是违反了双亲委托原则的对于一些未加载的非基础类(Object,String等)各个 web 应用自己的类加载器(WebAppClassLoader) 会优先加载加载不到时再交给 commonClassLoader 走双亲委托。 tomcat 的类加载器 Common 类加载器负责加载 /common 目录的类库这儿存放的类库可被 tomcat 以及所有的应用使用。 Catalina 类加载器负责加载 /server 目录的类库只能被 tomcat 使用。 Shared 类加载器负载加载 /shared 目录的类库可被所有的 web 应用使用但 tomcat 不可使用。 WebApp 类加载器负载加载单个 Web 应用下 classes 目录以及 lib 目录的类库只能当前应用使用。 Jsp 类加载器负责加载 Jsp 每一个 Jsp 文件都对应一个 Jsp 加载器。 我们将一堆 jar 包放到 tomcat 的项目文件夹下 tomcat 运行的时候能加载到这些 jar 包的 class 就是因为这些类加载器对读取到的二进制数据进行处理解析从中拿到了需要的类 SpringBoot 的 jar 包 当我们将一个 SpringBoot 项目打好包之后不妨解压看看里面的结构是什么样子的的 run.jar |——org | |——springframework | |——boot | |——loader | |——JarLauncher.class | |——Launcher.class |——META-INF | |——MANIFEST.MF |——BOOT-INF | |——class | |——Main.class | |——Begin.class | |——lib | |——commons.jar | |——plugin.jar | |——resource | |——a.jpg   | |——b.jpg classpath 可加载的类只有 JarLauncher.class Launcher.class Main.class Begin.class。在 BOOT-INF/lib 和 BOOT-INF/class 里面的文件不属于 classloader 搜素对象直接访问的话会报 NoClassDefDoundErr 异常。Jar 包里面的资源以 Stream 的形式存在他们本就处于 Jar 包之中java 程序时可以访问到的。当 springboot 运行 main 方法时在 main 中会运行 org.springframework.boot.loader.JarLauncher 和 Launcher.class 这两个个加载器你是否还及得前文提到过得 spi 技术这个加载器去加载受 stream 中的 jar 包中的 class。这样就实现了加载 jar 包中的 jar 这个功能否则正常的类加载器是无法加载 jar 包中的 jar 的 class 的只会根据 MAINFEST.MF 来加载 jar 外部的 jar 来读取里面的 class。 如何自定义类加载器 public class MyClassLoader extends ClassLoader{private String classpath;public MyClassLoader(String classpath) {this.classpath classpath;}Overrideprotected Class? findClass(String name) throws ClassNotFoundException {// 该方法是根据一个name加载一个类我们可以使用一个流来读取path中的文件然后从文件中解析出class来}} 调用 defineClass() 方法加载类 public static void main(String []args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{//自定义类加载器的加载路径MyClassLoader myClassLoadernew MyClassLoader(D:\\lib);//包名类名Class cmyClassLoader.loadClass(com.test.Test)if(c!null){// 做点啥}} 总结 本文从比较基础的层面解读了我们频繁使用却大部分人不是很了解的两个知识点—— spi 和 jar 机制。希望大家看完这篇文章后能对 SpringBoot 中的一些“黑魔法”有更深入的了解而不是停留在表面。

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

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

相关文章

泉州人才网网站seo诊断分析和优化方案

很多去意大利留学的学生会选择去米兰大学留学,那么留学米兰大学需要了解哪些重要事项呢?跟着出国留学网来看看吧!欢迎阅读。意大利留学米兰大学解析院校基本信息欧洲排名7所在省州伦巴第大区所在城市Milano学校性质公立建校年代1923年学校人数60406人官方…

网站建设维护天津网站优化怎么样

Exception: Gradle task assembleDebug failed with exit code 1 解决方案: 1.讲当前文件的distributionUrl值改为 https://mirrors.cloud.tencent.com/gradle/gradle-7.4-all.zip

知名网站制作全包建个人免费网站用哪个

据佳能官方透露,佳能RF 1.4、RF 2增倍镜与RF 100-500mm F4.5-7.1 L IS USM镜头并不完全兼容。在安装使用两款增倍镜时,用户需将RF 100-500mm镜头变焦环的变焦位置移动到超过300mm的远摄区域。而在搭配增倍镜后,镜头变焦范围将限定在300-500mm…

东南亚cod建站工具网站建设资格预审公告

1、低级语言和高级语言 计算机指令程序:0、1 组成的机器指令序列。特点:效率低、可读性差、难以维护。 汇编指令:用常用的符号代替0、1 序列来 表示机器指令,例如用ADD表示加法。 高级语言:面向对象设计的各类应用的程…

营销型网站制作的方法wordpress网站缩

目录 使用编辑器脚本注意函数解释信息调试方法键盘获取方法脚本练习 最近发现常用键盘的上下左右箭头去操作输入输出问题感觉很不是滋味,不像Linux那样,有vim的使用,就想着有没有什么方法更快捷,更方便的去使用电脑键盘&#xff0…

做网站放到百度上需要什么wordpress搭建拒绝访问

文章目录 前言双变量数据分类型数据对分类型数据--二维表分类对分类--复式条形图分类对数值--并列箱线图 数值型数据对数值型数据散点图相关系数 练习 前言 上一篇文章介绍的是单变量数据,本篇将介绍双变量数据。 双变量数据 描述分类数据对分类数据的描述方法&am…

深圳横岗做网站的h5网站后台管理模板

联想一键恢复系统教程?下面我们来看一看吧。 联想不同类型的电脑进入一键恢复界面的方法不一,台式机一体机就在电脑开机出现联想logo界面时按下FnF2组合键。 联想一键恢复系统教程 笔记本则寻找一键恢复按键,在电脑电源关闭的情况下按住几秒钟即可进…

中英文双语的网站怎么建设php个人网站简洁

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

商务网站建设的可行性分析包括门户网站个人可以做吗

网站权重与排名浅谈  网站权重定义&#xff1a;搜索引擎给网站总体赋予一定的权威值&#xff08;现今这个是一个没有确切的数据&#xff09;&#xff0c;对网站总体权威的评估或者评价&#xff0c;一个网站权重越高&#xff0c;在搜索引擎所占的份量越大&#xff0c;&#xf…

做视频网站视频文件都存放在哪云匠网app

最近看了一个Thread类&#xff08;忘记在哪里看的了&#xff09;&#xff0c;感觉不错。 创建线程时线程对应的函数必须是类的静态成员&#xff0c;由于静态成员无法访问类的非静态成员&#xff0c;我从前都是把对象的指针作为参数传递给线程函数来避免这个问题&#xff0c;但是…

网站建设服务详细解读网站当前位置 样式

漏洞简介 某电子文档安全管理系统存在任意用户登录漏洞&#xff0c;攻击者可以通过用户名获取对应的cookie&#xff0c;登录后台。 资产测绘 Hunter语法&#xff1a;web.icon“9fd216c3e694850445607451fe3b3568” 漏洞复现 获取Cookie POST /CDGServer3/LinkFilterServi…

做营销网站建设价格公司官网如何更新网站

Mac os 上面不支持apt-get install ,但是有个 brew install可以代替。 Homebrew是Mac OS的包管理器&#xff0c;可以方便地安装各种需要的软件。 1.1 安装Homebrew 如果没有安装Homebrew&#xff0c;需要在终端输入以下命令进行安装&#xff1a; /usr/bin/ruby -e "$(…

网站建设 教材制作网站需要什么语言

全站Ajax后退有两种方法&#xff0c;浏览器后退按钮加入历史链接。其中一种是常规的Ajax后退&#xff0c;这种后退是带有ajax效果的&#xff0c;要重新请求历史链接页面。另一种是将历史数据保存&#xff0c;后退时取出缓存的数据即可。后者比前者效率要高&#xff0c;所以速度…

亚圣信息科技做网站怎么样九九电视剧免费观看完整版

博主最近换了台新电脑&#xff0c;环境得从零开始配置&#xff0c;所以以下是博主从一台纯净机中配置环境&#xff0c;绝对的小白教程&#xff0c;大家第一次安装完全可以参考我的过程&#xff0c;闲话少说&#xff0c;直接开始&#xff01;&#xff01;&#xff01; 接下来介绍…

贵州企业展示型网站建设wordpress思维导图

点击蓝字关注我们1、#pragma once有什么作用&#xff1f;为了避免同一个头文件被包含&#xff08;include&#xff09;多次&#xff0c;C/C中有两种宏实现方式&#xff1a;一种是#ifndef方式&#xff1b;另一种是#pragma once方式。在能够支持这两种方式的编译器上&#xff0c;…

新开传奇网站刚开一秒第一区做门户网站的市场价格

学过面向对象语言的同学一定都知道String类&#xff0c;一定知道这个类对字符串的操作是多麽的方便&#xff0c;但是c语言中是没有这个类&#xff0c;甚至没有类的概念&#xff0c;但是glib帮我们做的这个“类” GString 除了使用gchar *进行字符串处理以外&#xff0c;Glib还…

国外优秀ui设计网站网站建设这门课好学吗

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>/* 程序描述&#xff1a;输出N*N中符合左右对角线与上下左右方向都没被使用的位置在每一行的所有情况使用检测左上角&#xff0c;正上角&#xff0c;右上…

网站域名注册需要什么手续WordPress主题 Slhao

目录 1 I/O 缓冲简介 1.1 什么是I/O 缓冲 1.2 I/O 缓冲的目的 2 文件 I/O 的内核缓冲 3 刷新文件 I/O 的内核缓冲区 3.1 什么是刷新文件 I/O 的内核缓冲区 3.2 控制文件 I/O 内核缓冲的系统调用函数 3.3 示例程序 4 控制文件 I/O 内核缓冲的标志 4.1 O_DSYNC 和 O_SY…

网站怎么做反爬虫网络推广的渠道有哪些

题目描述 思路分析 不是每次1了&#xff0c;而是直接加相同数字出现过的次数&#xff0c;比如有3个1&#xff0c;第二个1就是1&#xff0c;第三个直接2&#xff0c;而不是两次1&#xff0c;而且每次都记录每次的新值出现的次数&#xff0c;这样循环到新数未出现过为止 代码实…

常州房地产网站建设国家住房和城乡建设厅网站

随着技术的不断发展&#xff0c;大模型&#xff08;例如GPT-4&#xff09;在自然语言处理等领域表现出色。然而&#xff0c;随着时间的推移&#xff0c;一些人可能会质疑在2024年入局大模型是否为时已晚。本文将探讨这个问题&#xff0c;并提供观点和观察。 2024年&#xff0c;…