17、SPI

spi

1、什么是SPI
是Java核心包的接口(放在<java_home>/jre/lib下,被BootstrapClassLoader 加载),但是实现由第三方服务商实现。
第三方服务商的实现类的类名放在 /meta-inf/services 下。但是编译后的class类放在 web-inf/classes文件下

2、SPI是由上层服务提供的接口,加载下层的实现类。
3、SPI的使用场景:jdbc,slf4j,dubbo,spring

打破类加载器的双亲委派模式

Java的历史上一共有3次打破了类加载器的双亲委派模式
1、Java1.0刚出来的时候,这时候还没有双亲委派模式的这个概念(双亲委派是1.2提出来的)
2、osgi Java 9 提出来的模块化
3、spi

这里主要讲SPI模式是如何打破双亲委派模式的。
例如:JDBC。

// 加载Class到AppClassLoader(系统类加载器),然后注册驱动类  
// Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost:3306/testdb" ; 
// 通过java库获取数据库连接
Connection conn = java.sql.DriverManager.
getConnection ( url , "name" , "password" ) ; 

由上代码可知,获取JDBC连接,是DriverManger类来获取的,该类在获取连接的时候,加载了静态代码块,找到/META-INF/services的全路径类名,然后在/web-inf/classes中取寻找class 字节码文件。
但是由于,该类的接口在核心包。核心包是由BootstrapClassLoader加载的,该类的实现放在/web-inf/classes 目录下,BootstrapClassLoader加载不了,只能由线程上下文加载器(Tread.currentTread.getContext.ClassLoader,简称TCCL)加载器来加载,TCCL中默认存放了AppClassLoader加载器的引用。这种加载方式是反双亲委派模式的。

普通的加载:Java的基类是放在<java_home>/jre/lib下的,应用类都是调用基类的接口,所以类加载器的双亲委派模式可以保证层次的优先级,保证Java基本不被篡改。通俗的来讲,就是先加载基类,应用类调用基类。

spi加载:spi的接口是放在Java核心包的,核心包加载不了,需要依赖应用类加载器来加载实现类。

Tomcat中的类加载器

在Tomcat目录结构中,有三组目录(/common、/server 、/shared)
1、在common目录下,类库可以被Tomcat和所有的应用程序共同使用
2、在server目录下,类库可以被Tomcat使用,但被应用程序屏蔽
3、在shared目录下,类库可以被所有的应用程序共同使用,但是被TOMCAT屏蔽

在这里插入图片描述

灰色背景的3个类加载器是JDK默认提供的类加载器,这3个加载器的作用前面已经介绍过了。而 CommonClassLoader、CatalinaClassLoader、SharedClassLoader 和 WebAppClassLoader 则是 Tomcat 自己定义的类加载器,它们分别加载 /common/、/server/、/shared/* 和 /WebApp/WEB-INF/* 中的 Java 类库。其中 WebApp 类加载器和 Jsp 类加载器通常会存在多个实例,每一个 Web 应用程序对应一个 WebApp 类加载器,每一个 JSP 文件对应一个 Jsp 类加载器。

从图中的委派关系中可以看出,CommonClassLoader 能加载的类都可以被 CatalinaClassLoader 和 SharedClassLoader 使用,而 CatalinaClassLoader 和 SharedClassLoader 自己能加载的类则与对方相互隔离。WebAppClassLoader 可以使用 SharedClassLoader 加载到的类,但各个 WebAppClassLoader 实例之间相互隔离。而 JasperLoader 的加载范围仅仅是这个 JSP 文件所编译出来的那一个 Class,它出现的目的就是为了被丢弃:当服务器检测到 JSP 文件被修改时,会替换掉目前的 JasperLoader 的实例,并通过再建立一个新的 Jsp 类加载器来实现 JSP 文件的 HotSwap 功能。

spring加载问题

Q:如果有10个web应用程序都用到了spring的话,spring的文件放在common 目录或者shared目录下供所有的应用程序使用。spring的作用是加载所有的bean,那么放在/WebApp/WEB-INF下的应用程序,spring怎么加载呢?

A:这是个很明显的SPI加载机制。spring的程序是由CommonClassLoader或者ShardClassLoader类加载器加载的。
当应用程序访问时,spring会用到线程的上下文类加载器(线程的类加载器自动设置为了WebAppClassLoader),去加载/WebApp/WEB-INF下的应用程序。所以不管spring放到哪儿,哪个WebApp的应用调用了spring,spring都会用TCCL去加载应用程序。

Java项目中的classpath

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水资源是人社会的宝贵财富,在生活、工农业生产是不可缺少的。随着世界人口的增长及工农业生产的发展,需水量也在日益增长,水已经变得比以往任何时候都要珍贵。但是,由于人的生产和生活,导致水体的污染,水质恶化,使有限的水资源更加紧张。长期以来,油物质(石油物质和动植物油)一直是水和土壤的重要污染源。它不仅对人的身体健康带来极大危害,而且使水质恶化,严重破坏水体生态平衡。因此各国都加强了油物质对水体和土壤的污染的治理。对于水油含量的检测,我国处于落后阶段,与国际先进水平存在差距,所以难以满足当今技术水平的要求。为了取得具有代表性的正确数据,使分析数据具有与现代测试技术水平相应的准确性和先进性,不断提高分析成果的可比性和应用效果,检测的方法和仪器是非常重要的。只有保证了这两方面才能保证快速和准确地测量出水污染物含量,以达到保护和治理水污染的目的。开展水油污染检测方法、技术和检测设备的研究,是提高水污染检测的一条重要措施。通过本课题的研究,探索出一套适合我国国情的水质污染现场检测技术和检测设备,具有广泛的应用前景和科学研究价值。 本课题针对我国水体的油污染,探索一套检测油污染的可行方案和方法,利用非分散红外光度法技术,开发研制具有自主知识产权的适合国情的适于野外便携式的测油仪。利用此仪器,可以检测出被测水样亚甲基、甲基物质和动植物油脂的污染物含量,为我国众多的环境检测站点监测水体的油污染状况提供依据。
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值