模块  java.base
软件包  java.util.spi

Interface ResourceBundleProvider

  • 所有已知实现类:
    AbstractResourceBundleProvider

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

    开发资源包服务

    给定baseName的资源包的服务必须具有表单的完全限定类名:
    <package of baseName> + ".spi." + <simple name of 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");
         }
         // this provider maps the resource bundle to per-language package
         protected String toBundleName(String baseName, Locale locale) {
             return "p." + locale.getLanguage() + "." + baseName;
         }
    
         public ResourceBundle getBundle(String baseName, Locale locale) {
             // this module only provides bundles in French
             if (locale.equals(Locale.FRENCH)) {
                  return super.getBundle(baseName, locale);
             }
             // otherwise return null
             return null;
         }
     }
    此示例提供法语区域设置的“ com.example.app.MyResources ”资源包。 传统上,所有语言环境的资源包都与资源包基本名称打包在同一个包中。 当在多个模块和两个包含同名包( split package)的模块中部署资源包时,每个模块中的资源包可以打包在不同的包中,如此示例所示,此提供程序打包资源每个语言包中的捆绑包,即法语区域设置的com.example.app.fr

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

    AbstractResourceBundleProvider提供了基本的实施ResourceBundleProvider和子类可以覆盖toBundleName方法返回要加载的资源的特定提供者的位置,例如,每个语言的包。 例如,提供程序可以覆盖ResourceBundleProvider.getBundle方法,以仅搜索已知的受支持语言环境或以其他格式(如XML)返回资源包。

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

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

    Obtaining resource bundles from providers

    消费者模块的模块声明调用其中一个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
    另请参见:
    AbstractResourceBundleProviderResource Bundles and Named ModulesServiceLoader
    • 方法详细信息

      • getBundle

        ResourceBundle getBundle​(String baseName,
                                 Locale locale)
        返回给定包名称和语言环境的ResourceBundle 该方法返回null如果没有ResourceBundle发现给定参数。
        参数
        baseName - 资源包的基本包名称,完全限定的类名
        locale - 应为其加载资源包的语言环境
        结果
        为给定参数创建的ResourceBundle,如果找不到给定参数的 ResourceBundle ,则 ResourceBundle null