Module java.base
Package java.util.spi

Interface ResourceBundleProvider

所有已知的实现类:
AbstractResourceBundleProvider

public interface ResourceBundleProvider
ResourceBundleProvider是用于资源包的服务提供者接口。它被ResourceBundle.getBundle工厂方法使用,以定位和加载通过ServiceLoader部署为模块的服务提供者。

开发资源包服务

给定baseName的资源包服务必须具有以下形式的完全限定类名:
<baseName的包名> + ".spi." + <baseName的简单名称> + "Provider"
服务类型位于spi子包中,因为它可能被打包在与资源包提供者不同的模块中。例如,名为com.example.app.MyResources的资源包的服务必须是com.example.app.spi.MyResourcesProvider
 package com.example.app.spi;
 public interface MyResourcesProvider extends ResourceBundleProvider {
 }
 

部署资源包服务提供者

资源包可以在一个或多个模块中部署为一个或多个服务提供者。例如,名为"com.example.app.spi.MyResourcesProvider"的服务提供者具有以下实现类:
 import com.example.app.spi.MyResourcesProvider;
 class MyResourcesProviderImpl extends AbstractResourceBundleProvider
     implements MyResourcesProvider
 {
     public MyResourcesProviderImpl() {
         super("java.properties");
     }
     // 此提供者将资源包映射到每种语言的包
     protected String toBundleName(String baseName, Locale locale) {
         return "p." + locale.getLanguage() + "." + baseName;
     }

     public ResourceBundle getBundle(String baseName, Locale locale) {
         // 此模块仅提供法语资源包
         if (locale.equals(Locale.FRENCH)) {
              return super.getBundle(baseName, locale);
         }
         // 否则返回null
         return null;
     }
 }
此示例提供了法语区域的"com.example.app.MyResources"资源包。传统上,所有区域设置的资源包都打包在与资源包基本名称相同的包中。当在多个模块中部署资源包并且两个模块包含相同名称的包时,不支持分割包,每个模块中的资源包可以打包在不同的包中,如此示例所示,此提供者将资源包打包在每种语言的包中,即com.example.app.fr用于法语区域。

一个提供者可以提供多个服务,每个服务都是针对不同基本名称的资源包的服务。

AbstractResourceBundleProvider提供了ResourceBundleProvider的基本实现,子类可以重写toBundleName方法,以返回特定于提供者的资源加载位置,例如每种语言的包。提供者可以重写ResourceBundleProvider.getBundle方法,例如仅搜索已知支持的区域设置或返回其他格式的资源包,如XML。

此提供者模块的模块声明指定以下指令:

     provides com.example.app.spi.MyResourcesProvider with com.example.impl.MyResourcesProviderImpl;
 

从提供者获取资源包

调用ResourceBundle.getBundle工厂方法从服务提供者获取资源包的消费者模块的模块声明必须指定以下指令:
     uses com.example.app.spi.MyResourcesProvider;
 
ResourceBundle.getBundle("com.example.app.MyResource", locale)定位并加载com.example.app.spi.MyResourcesProvider服务的提供者,然后调用ResourceBundleProvider.getBundle("com.example.app.MyResource", locale)查找给定基本名称和区域设置的资源包。如果消费者模块是com.example.app.spi.MyResourcesProvider的资源包服务提供者,则ResourceBundle.getBundle将仅从服务提供者中定位资源包。否则,ResourceBundle.getBundle可能会根据调用的ResourceBundle.getBundle方法的规范继续搜索资源包在其他模块和类路径中。
自版本:
9
参见:
  • Method Summary

    Modifier and Type
    Method
    Description
    getBundle(String baseName, Locale locale)
    返回给定包名称和区域设置的ResourceBundle
  • Method Details

    • getBundle

      ResourceBundle getBundle(String baseName, Locale locale)
      返回给定包名称和区域设置的ResourceBundle。如果找不到给定参数的ResourceBundle,则此方法返回null
      参数:
      baseName - 资源包的基本包名称,完全限定的类名
      locale - 应加载资源包的区域设置
      返回:
      为给定参数创建的ResourceBundle,如果找不到给定参数的ResourceBundle,则返回null