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

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

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

faces-config.xml中

    com.mkyong.messages msg    

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

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

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

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

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

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

 ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale); 

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

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

我不担心性能。 ResourceBundle已经在内部缓存它们。


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

默认情况下,只创建一个。 另请参阅ResourceBundle API文档 :

缓存管理

默认情况下,getBundle工厂方法创建的资源包实例会被缓存,如果已缓存,则工厂方法会多次返回相同的资源包实例。 getBundle客户端可以清除缓存,使用生存时间值管理缓存资源包实例的生存期,或指定不缓存资源包实例。 有关详细信息,请参阅getBundle工厂方法 , clearCacheResourceBundle.Control.getTimeToLiveResourceBundle.Control.needsReload的说明。

通过查看实例的哈希码,您可以轻松地在调试器中certificate自己。


顺便提一下, 声明还有一个额外的好处,即@ManagedProperty("#{msg}")也可以在托管bean中注入bundle。 另请参阅此问答: 在托管bean中读取资源包属性 。

您已经从答案中看到一个全局资源包就足够了。 关于表现:

您有两种标准的Res​​ourceBundle实例:

  • PropertyResourceBundle – * [_ LOCALE] .properties文件,和
  • ListResourceBundle,一个java类(使用带有’。’的包名) – * [_ LOCALE] .class。

对于ListResourceBundle:

每个语言环境java类都创建一个包含共享(!)键和本地化文本的字符串数组。 在JVM中共享密钥字符串很不错。 所有字符串都会尽早加载。

所以可能值得提供一个ListResourceBundle。

但是,对于翻译,您可能需要维护一些非java翻译记忆库,tmx,xliff等。 并在构建过程中生成java。

第一个选项 – 因为它是应用程序作用域并在启动时加载