在一个应该在Java EE7中的限定符中@Nonbinding注释的目的是什么?

时间:2014-10-08 18:54:24

标签: dependency-injection cdi java-ee-7 inject

我正在阅读JavaEE 7中的CDI次注入,特别是使用@Qualifier@Producescustom Data type注入到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;

我的问题是:

  1. @Nonbinding注释的含义是什么?为什么需要呢?

  2. 方法签名是否应始终如此@Nonbindng public String value();。我问这个的原因是我看过几个不同的例子,但它们都有相同的签名。这是允许的:

  3. public @interface HttpParam {
           @Nonbinding public int value();
        }
    
    1. 我可以在界面中定义多个方法。也就是说,是否允许以下​​内容?
    2.  public @interface HttpParam {
             @Nonbinding public String value();
             @Nonbinding public int value1();
          } 

      由于

1 个答案:

答案 0 :(得分:13)

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

  2. 在这种情况下,producer方法生成的bean具有限定符@HttpParam("")。如果参数具有约束力(即不是@Nonbinding),则@HttpParam("")与注入点上的@HttpParam("username")不匹配。

  3. 您可以拥有任意数量的限定符参数,绑定或非绑定。

  4. 请参阅CDI规范中的Typesafe resolution