哪個JSF 1.2組件負責實例化faces-config.xml中指定的託管bean?Jsf自定義託管bean臨時處理程序
我想用我的定製版本替換這個組件,它將在bean實例成功創建後執行一些額外的任務。
哪個JSF 1.2組件負責實例化faces-config.xml中指定的託管bean?Jsf自定義託管bean臨時處理程序
我想用我的定製版本替換這個組件,它將在bean實例成功創建後執行一些額外的任務。
沒有人對此負責。這只是EL負責的。如果表達式#{beanname}
返回null,它將創建一個與託管bean名稱相關聯的表達式。
在您的具體情況下,解決此問題的常規方法是使用bean的構造函數或使用註釋爲@PostConstruct
的bean的公共方法。
public class Bean {
public Bean() {
// Put code here which is to be executed during construction, but before
// setting of the managed properties (<managed-property> declarations).
}
@PostConstruct
public void init() {
// Put code here which is to be executed AFTER construction
// and the setting of managed properties.
}
}
如果你真的想採取EL在你自己的手中解決,那麼最好你可以做的是實現一個自定義ELResolver
。你可以找到here這篇文章。
這是在JSF 1.2規範詳細介紹了JSP解析器結構:
Faces ELResolver for JSP
|_ faces.ImplicitObjectELResolverForJSP
|_ faces.ManagedBeanELResolver
|_ faces.ResourceBundleELResolver
|_ ELResolvers in application configuration resources
|_ faces.VariableResolverChainWrapper (wraps deprecated API)
|_ faces.PropertyResolverChainWrapper (wraps deprecated API)
|_ ELResolvers from Application.addELResolver()
託管bean將由faces.ManagedBeanELResolver
被實例化(這僅僅是一個標籤,開發者可以通過引用它,一個沒有名字公共課)。
頂級ELResolver
通過Application
(您可以通過ApplicationFactory
提供)提供。但是,儘管JSF規範詳細描述了行爲,但API並未公開受管理bean將被實例化的方式。要裝飾實現來消除新實例化的bean與從請求/會話/應用程序作用域返回的bean之間的歧義是很困難的。
BalusC's post爲解決這個問題提供了一些很好的策略。
雖然JSF 2.0給託管bean設施帶來了變化,但據我所知,它並沒有改變API的這個方面。
@PostConstruct是JSF 1.2的發展方向。 如果您使用的是JavaEE 6,那麼您也可以在方法上使用@Produces註釋來創建自定義工廠方法。