我的ExampleBean
仅在创建时需要UsefulBean1
的信息。因此,在获取所需信息后,我可以丢弃UsefulBean1
实例。
@ManagedBean
public class ExampleBean {
private int value;
@Inject
public void setUseful(UsefulBean usefulBean){
this.value = usefulBean.getValue();
//bye, bye usefulBean. see ya.
}
}
但是我的ExampleBean2
呢,在创建时需要结合来自UsefulBean1
和UsefulBean2
的信息?
我知道我可以得到它们@Injected
并将其信息合并到@PostConstruct
方法中:
@ManagedBean
public class ExampleBean2 {
private int value;
@Inject
private UsefulBean1 usefulBean1;
@Inject
private UsefulBean2 usefulBean2;
@PostConstruct
public void init(){
this.value = this.usefulBean1.getValue() + this.usefulBean2.getValue();
//from this point on, the usefulBeans fields are useless...
this.usefulBean1 = null;
this.usefulBean2 = null;
}
}
但是我保留了这两个不再需要的字段(this.usefulBean1
和this.usefulBean2
)使我有些恼火。
我尝试了多参数设置方法,但无济于事。
这肯定不会破坏任何东西或浪费资源。但是,如果没有将字段用作临时丢弃变量,代码IMHO将会更加清晰。
是否有必要使用多个其他bean中的数据来初始化CDI bean,而无需将其设置为字段?
答案 0 :(得分:0)
(首先,@ManagedBean
与CDI无关。不应使用。)
(第二,总是考虑寿命(“范围”):每个bean应该生存多长时间?在这个示例中,我假设您希望ExampleBean2
成为应用程序中唯一这样的bean,所以我会用@ApplicationScoped
标记(您在参考代理服务器上的一些评论,因此这是一个合理的猜测)。您可以使用@RequestScoped
或@Dependent
或其他范围进行注释相反,如果您不使用任何范围注释对其进行注释,则其行为将与您使用@Dependent
对其进行注释的方式完全一样。)
赞:
@ApplicationScoped
public class ExampleBean2 {
private final int value;
/**
* @deprecated To be used only by the CDI framework, not end users.
*/
@Deprecated
protected ExampleBean2() {
super();
}
@Inject
public ExampleBean2(final UsefulBean1 usefulBean1, final UsefulBean2 usefulBean2) {
super();
this.value = this.usefulBean1.getValue() + this.usefulBean2.getValue();
}
}