Java EL係列-3.1.JUEL表達式工廠
inkfish翻譯,請勿商業性質轉載,轉載請注明來源(https://blog.csdn.net/inkfish )。本文是我學習JUEL同時,對原網站進行的簡單的翻譯,原網站地址:https://juel.sourceforge.net/guide/basic/factory.html 。說實話,這篇翻譯的的確不怎樣。
表達式工廠(Expression Factory)
如果要使用EL
,就必須要有一個javax.el.ExpressionFactory
的實例。表達式工廠用於創建多種類型的表達式。JUEL
的表達式工廠實現類是de.odysseus.el.ExpressionFactoryImpl
,獲得表達式工廠實例的最方便方法是:
javax.el.ExpressionFactory factory = new de.odysseus.el.ExpressionFactoryImpl();
表達式工廠是線程安全的,允許創建數量不限的表達式。表達式工廠提供下麵的操作:
- 提供類型強製轉換(Type coercions)
- 創造樹狀值表達式(Tree value expressions)
- 創建對象值表達式(Object value expressions)
- 創建樹狀方法表達式(Tree method expressions)
表達式緩存
每一個工廠實例使用它自己的表達式緩存。緩存的表達式是一個很重要的特性,因為解析是一個相對昂貴的操作。一個表達式緩存映射表達式字符串到他們已經解析過的表達方式(樹)。
JUEL 提供一個緩存接口,該接口允許應用使用他們自己的緩存機製。雖然,在絕大多數情形中,JUEL 的默認實現應該是足夠好的。默認緩存使用下麵兩種映射:
- 主映射是用
java.util.LinkedHashMap
實現的,如果緩存的上線達到,那麼新的實體(entry)會被添加,並且用最近使用原則(LRU )從主映射裏移除舊的映射關係,並把舊的映射關係保存到二級映射表中。 - 二級映射表是用
java.util.WeakHashMap
來實現的。實體保證生命期至少和他們字符串的強引用一樣長。沒有任何引用的時候對應的實體才可能被垃圾回收器回收。
默認的構造器使用的緩存容量是1000,你可以通過設置javax.el.cacheSize
屬性來自定義緩存大小,比如5000:
java.util.Properties properties = new java.util.Properties(); properties.put("javax.el.cacheSize", "5000"); javax.el.ExpressionFactory factory = new de.odysseus.el.ExpressionFactoryImpl(properties);
使用自己的緩存機製可以參考“高級主題”一節。
類型轉換
在計算表達式中,有幾個點可能會進行類型轉換。
- 算術或邏輯操作中進行的強製轉換
- 值表達式強製轉換成創建時期望的類型
- 字符方法表達式計算的文字會強製轉換成創建時期望的類型
- 非字符方法表達式,最後一個屬性強製轉換到方法名(翻譯不出來)
- 符合表達式在連接的時候強製轉換所有字表達式為字符串
所有這些強製轉換依照的都是同樣的規則,規範中對這些強製轉換規則有詳細的描述。它支持字符串、字符、布爾、枚舉、數字類型間的轉換,而且從字符串轉換到其他類型使用了JavaBeans 的屬性編輯器來支持。客戶端程序通過表達式工廠方法能夠實現EL 的強製轉換規則。
ExpressionFactoryImpl.coerceToType(Object, Class<?>)
上麵那段代碼返回的是Object
類型對象。JUEL
能被配置成用其他的強製轉換規則,具體可以參考“高級主題”一段。
工廠配置
工廠可以通過屬性文件配置。下麵是不指定屬性時,表達式工廠創建的機製,屬性的查詢如下:
-
JAVA_HOME/lib/el.properties
——如果存在javax.el.ExpressionFactory
屬性,而且值是de.odysseus.el.ExpressionFactoryImpl
,那麼JUEL 就作為默認的el啟動; -
System.getProperties()
——如果規則1沒有符合,係統屬性把javax.el.ExpressionFactory
的值設置為de.odysseus.el.ExpressionFactoryImpl
,這兒設置能覆蓋1的設置; -
el.properties
文件在類路徑的任何地方——這裏設置的屬性能覆蓋1和2成為默認值。
有了上麵的那些,接下來下麵的屬性會讀到:
-
javax.el.cacheSize
——表達式緩存的大小(默認是1000); -
javax.el.methodInvocations
——如果設置成true
意味著允許方法調用。更多信息請參考“高級主題”一節; -
javax.el.nullProperties
——如果設置成true
將解析null
屬性。更多信息請參考“高級主題”一節; -
javax.el.varArgs
——如果設置成true
則允許表達式裏存在可變變量的函數/方法調用。
工廠類同樣提了供構造器,可以讓你準確的傳遞你的屬性。如果你僅僅想要從JEE5 風格變成JEE6 風格,JUEL 提供枚舉構造器作為profiles使用。
最後更新:2017-04-02 04:01:45