哪个JSF 1.2组件负责实例化faces-config.xml中指定的托管bean?
我想用我的定制版本替换这个组件,该版本将在成功创建bean实例后执行一些额外的任务。
答案 0 :(得分:2)
没有任何一个组成部分对此负责。只是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一篇关于此事的文章。
答案 1 :(得分:1)
以下是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的这一方面。
答案 2 :(得分:1)
@PostConstruct是JSF 1.2的方法。 如果您使用的是JavaEE 6,那么您还可以在方法上使用@Produces批注来创建自定义工厂方法。
public class CustomBeanFactory {
@Produces
public Bean getBean() {
Bean bean = new Bean();
System.out.println("Created new bean.");
return bean;
}
}