哪个JSF1.2组件负责实例化faces-config.xml中指定的托管bean?
我想用我的定制版本替换这个组件,它将在bean实例成功创建后执行一些额外的任务。
发布于 2009-12-20 22:33:41
没有一个组件对此负责。这只是EL造成的。如果表达式#{beanname}返回null,它将创建一个与受管bean名称相关联的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上找到一篇关于这方面的文章。
发布于 2009-12-20 23:45:59
以下是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为解决这个问题提供了几个很好的策略。
尽管JSF2.0对托管bean工具进行了更改,但据我所知,它并没有更改API的这一方面。
发布于 2010-03-22 13:49:21
@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;
}
}https://stackoverflow.com/questions/1935525
复制相似问题