如何丢弃一次性@Injected豆?

时间:2019-01-23 20:14:32

标签: java dependency-injection cdi idioms

我的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呢,在创建时需要结合来自UsefulBean1UsefulBean2的信息?

我知道我可以得到它们@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.usefulBean1this.usefulBean2)使我有些恼火。

我尝试了多参数设置方法,但无济于事。

这肯定不会破坏任何东西或浪费资源。但是,如果没有将字段用作临时丢弃变量,代码IMHO将会更加清晰。

是否有必要使用多个其他bean中的数据来初始化CDI bean,而无需将其设置为字段?

1 个答案:

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

}