38

Java 中 Meta-INF 服务的目的是什么?

4

3 回答 3

23

它旨在存储服务提供者配置文件。

服务提供者是打包为 JAR 的服务提供者接口的实现。

服务加载器发现并加载服务提供者配置文件中声明的所有实现。

配置文件是以接口的完全限定名称命名的文件,其内容是实现的完全限定名称列表。

以下是 Servlet 3.0 在 webapp 启动时使用的 javax.servlet.ServletContainerInitializer 提供程序配置文件的示例。

org.apache.jasper.servlet.JasperInitializer
org.springframework.web.SpringServletContainerInitializer

在这个例子中

  • Tomcat 是服务加载器;
  • javax.servlet.ServletContainerInitializer 是服务提供者接口
  • 名为 javax.servlet.ServletContainerInitializer 的文件是 Service Provider 配置文件;
  • org.apache.jasper.servlet.JasperInitializer 和 org.springframework.web.SpringServletContainerInitializer 是服务提供者

当tomcat启动webapp同时调用

onStartup(java.util.Set<java.lang.Class<?>> types, ServletContext context)

JasperInitializer 和 SpringServletContainerInitializer 类的方法

于 2018-10-11T09:30:46.267 回答
18

看看ServiceLoader文档

于 2010-12-28T17:06:25.887 回答
-1

在 Java 9 之前,ServiceLoader从 META-INF/services 中的文件中查找 Service 的实现,该文件具有与 Service 接口相同的完全限定名称。它包含实现的完全限定名称列表。

从 Java 9 开始,它有模块,模块有模块描述符。这些“模块”可以定义 ServiceLoader 可以加载的服务及其实现。

于 2021-08-08T10:48:00.700 回答