Java META-INF/services

50

Java中META-INF/services的目的是什么?


相关问题:https://dev59.com/J3VD5IYBdhLWcg3wJIIK - dkb
3个回答

28

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

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

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

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

以下是javax.servlet.ServletContainerInitializer提供者配置文件的示例,该配置文件用于Web应用程序启动时使用Servlet 3.0。

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

在这个例子中

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

当Tomcat启动web应用程序时,同时调用两者。

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

JasperInitializer和SpringServletContainerInitializer类中的方法


18

14
尽管这个回答从理论上回答了问题,但最好在此处包含回答的关键部分,并提供链接作为参考。 - dan1st

-1
在Java 9之前,ServiceLoader会从META-INF/services文件中查找实现服务的实现,该文件的完全限定名称与服务接口相同。它包含实现的完全限定名称列表。
从Java 9开始,它有模块和模块描述符。这些“模块”可以定义服务及其实现,ServiceLoader可以加载这些服务。

我认为这是错误的。META-INF不包含模块?你能指出一个它们包含模块的例子吗? - vab2048

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接