CDI 注入的 bean 是否需要 getter 和 setter?

Are getters and setters needed for CDI injected beans?

当使用 CDI 注入 bean 时:

@Inject Person person;

是setter和getterneeded/recommended吗?

import javax.inject.Inject;
import javax.inject.Named;

@Named
@SessionScoped
public class myJSFBean{

  @Inject Person person;

  public void setPerson (Person person){
    this.person = person;
  }
  public Person getPerson (){
    return person;
  }

我找到了这个文档,但我不明白它的意思: http://docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html

CDI (容器依赖注入) Java EE 6 应用可以针对不同的注入点:字段、构造函数和setters.

所以简短的回答是,如果您不使用,则不需要setter方法它作为注入点。

getter 也可以忽略,除非你需要一个访问字段状态(根据经验,这在 CDI 环境,容器注入的同一个字段在其他组件中仍然可以通过它访问)。

根据Weld Documentation

Notice that it isn’t necessary to create a getter or setter method to inject one bean into another. CDI can access an injected field directly (even if it’s private!), which sometimes helps eliminate some wasteful code. The name of the field is arbitrary. It’s the field’s type that determines what is injected.

我什至认为 getter 有害。

由于封装原则,getters 和 setter 在大多数 IDE 和上面的示例中默认为 public。这意味着你用 CDI 注入污染了你的自动完成。这些不应该在您的 class.

之外可见

如果您通过 @RequestScoped bean 中的 getter 访问 @ApplicationScoped,请求范围的 bean 将始终被不必要地实例化,这会降低性能。 CDI bean 应该始终在需要的地方注入,而不是跨 bean 访问。您将阻止 CDI 正确处理您的示波器。

所以真正剩下的就是一个 private getter,无论如何这是多余的,因为在你 [=29] 之前你永远不必修改 cdi bean =]它。