JSF国际化f:loadbundle或通过faces-config:性能点

Che*_*tan 5 java jsf resourcebundle internationalization java-ee

有两种方法可以将属性文件加载到JSF 2.0中.

  1. 全局资源包要全局加载属性文件,以便所有jsf页都可以访问消息.您可以创建"faces-config.xml"文件并显式声明属性文件.

faces-config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
     <application>
      <resource-bundle>
        <base-name>com.mkyong.messages</base-name>
        <var>msg</var>
       </resource-bundle>
     </application>
</faces-config>
Run Code Online (Sandbox Code Playgroud)

选项2:本地资源包在本地或仅为指定页面加载属性文件.<f:loadBundle />在页面中声明需要访问messages.properties中的消息的标记.

在这两个中哪一个给了我更好的表现?

假设我使用第一个选项,是否意味着在应用程序启动期间所有捆绑包都被加载或是否是延迟加载?(一经请求)

如果选择第二个选项,是否可能导致每个ViewRoot多次加载bundle?

Java ResourceBundle是工厂类,它在servlet容器中提供单例对象吗?

我的意思是getBundle方法是工厂方法,它总是创建单独的对象?

ResourceBundle myResources =
      ResourceBundle.getBundle("MyResources", currentLocale);
Run Code Online (Sandbox Code Playgroud)

假设我有一个页面abc.xhtml,我使用的是f:loadBundle,有1000个用户访问此页面,这是否意味着会创建1000个resouceBundle对象?或者它只是所有页面实例共享的对象?

The*_*bit -1

第一个选项 - 因为它是应用程序范围并在启动时加载