Jsf自定义托管bean即时处理程序

时间:2009-12-20 11:08:49

标签: jsf

哪个JSF 1.2组件负责实例化faces-config.xml中指定的托管bean?

我想用我的定制版本替换这个组件,该版本将在成功创建bean实例后执行一些额外的任务。

3 个答案:

答案 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;
        }

}