@PostConstruct
构建托管 bean 时,根本不调用支持 bean 的超类。只有在您的情况下,例如通过在 EL 中使用来构造该超类的完全独立的托管 bean 实例时,才会调用它。#{baseBean}
您实际上最终得到了两个完全独立的实例#{baseBean}
,#{smartBoxSearchBean}
其中类自己的@PostConstruct
方法在托管 bean 类本身上独立调用。
这个设计有些奇怪。支持 bean 的超类通常根本不用作托管 bean。
我建议修改您的方法如下:
public abstract class BaseBean {
@ManagedProperty("#{contextBean}")
private ContextBean contextBean;
public Context getContext() {
return contextBean.getContext();
}
}
和
@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {
@PostConstruct
public void setUp() {
jsonHelper = getContext().get(SmartBoxJsonHelper.class);
}
}
或者也许这个,如果你根本不需要ContextBean
其他目的
public abstract class BaseBean {
@ManagedProperty("#{contextBean.context}")
private Context context;
public Context getContext() {
return context;
}
}
请注意,@ManagedProperty
以这种方式在超类中声明时效果很好。
更新:根据功能要求,您还可以解耦 bean,只需#{baseBean}
将{smartBoxSearchBean}
.
@ManagedBean
@RequestScoped
public class BaseBean {
@ManagedProperty("#{contextBean}")
private ContextBean contextBean;
private Context context;
@PostConstruct
public void init() {
context = contextBean.getContext();
}
}
和
@ManagedBean
@RequestScoped
public class SmartBoxSearchBean {
@ManagedProperty("#{baseBean}")
private BaseBean baseBean;
@PostConstruct
public void setUp() {
jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class);
}
}