我正在阅读JavaEE 7中的CDI注入(inject),特别是使用@Qualifier@Producescustom Data type注入(inject)到bean中。

我有下面的代码从JBoss documentation截取到页面的两端。

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface HttpParam {
   @Nonbinding public String value();
}

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;

class HttpParams {
   @Produces @HttpParam("")
   String getParamValue(InjectionPoint ip) {
      ServletRequest request = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
      return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value());
   }
}

此限定符可以按以下方式使用:
@HttpParam("username") @Inject String username;
@HttpParam("password") @Inject String password;

我的问题是:
  • @Nonbinding注释是什么意思?为什么需要它?
  • 方法签名应始终像此@Nonbindng public String value();一样。我问这个的原因是我看到了几个不同的示例,但是它们都具有相同的签名。那是允许的以下内容:

  • 公共(public)@interface HttpParam {
    @Nonbinding public int value();
    }
  • 我可以在接口(interface)中定义多个方法吗?也就是说,以下内容是否被允许?

  • 公共(public)@interface HttpParam {
    @Nonbinding public String value();
    @Nonbinding public int value1();
    }

    谢谢

    最佳答案

  • 缺省情况下,会考虑使用限定符参数来将Bean限定符与注入(inject)点限定符进行匹配。不考虑使用@Nonbinding参数进行匹配。
  • 在这种情况下,由生产者方法生产的bean具有限定符@HttpParam("")。如果参数是绑定(bind)的(即不是@Nonbinding),则@HttpParam("")与注入(inject)点上的@HttpParam("username")不匹配。
  • 您可以具有任意数量的限定词,可以是绑定(bind)的,也可以是非绑定(bind)的。

  • 请参阅CDI规范中的Typesafe resolution

    10-06 13:20