Dependency injection 限定符中@Nonbinding注释在JavaEE7中的作用是什么?

Dependency injection 限定符中@Nonbinding注释在JavaEE7中的作用是什么?,dependency-injection,cdi,java-ee-7,inject,Dependency Injection,Cdi,Java Ee 7,Inject,我正在阅读JavaEE7中的CDI注入,特别是使用@Qualifier和@products将自定义数据类型注入bean 下面的代码取自本页末尾 @Qualifier @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER}) public @interface HttpParam { @Nonbinding public String value(); } import javax.enterprise.inject.Pro

我正在阅读JavaEE7中的
CDI
注入,特别是使用
@Qualifier
@products
自定义数据类型
注入bean

下面的代码取自本页末尾

@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
    注释是什么意思?为什么需要它

  • 方法签名是否应始终如下所示
    @nonbinding public String value()。我问这个问题的原因是我见过几个不同的例子,但它们都有相同的签名。这是允许的:

  • public@interface-HttpParam{ @非绑定公共int值(); }
  • 我可以在接口中定义多个方法吗。也就是说,是否允许以下情况
  • public@interface-HttpParam{ @非绑定公共字符串值(); @不具约束力的公共int值1(); } 谢谢

  • 默认情况下,将bean限定符与注入点限定符匹配时考虑限定符参数。不考虑使用
    @非绑定
    参数进行匹配

  • 在本例中,producer方法生成的bean具有限定符
    @HttpParam(“”
    )。如果参数是绑定的(即非
    @Nonbinding
    ),则
    @HttpParam(“”
    将与注入点上的
    @HttpParam(“用户名”)
    不匹配

  • 您可以有任意数量的限定符参数,绑定或非绑定


  • 请参阅CDI规范中的。

    是否可以给出绑定和非绑定的示例,并说明其区别。这将非常有帮助。我在尝试将拦截器绑定与参数化注释一起使用时,遇到了您在第二个解释中描述的确切行为。我不顾一切地想找到解决办法。你救了我一天。谢谢。 public @interface HttpParam { @Nonbinding public int value(); } public @interface HttpParam { @Nonbinding public String value(); @Nonbinding public int value1(); }