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

bra*_*orm 9 dependency-injection inject cdi java-ee-7

我正在阅读CDIJavaEE 7中的注入,特别是使用@Qualifier@Produces注入custom Data typebean.

我从JBoss文档中获取了以下代码,用于页面的末尾.

@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());
   }
}
Run Code Online (Sandbox Code Playgroud)

此限定符可以通过以下方式使用:

@HttpParam("username") @Inject String username;
@HttpParam("password") @Inject String password;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. @Nonbinding注释是什么意思?为什么需要呢?

  2. 方法签名应该总是这样吗@Nonbindng public String value();?我问这个的原因是我看过几个不同的例子,但它们都有相同的签名.这是允许的:

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

谢谢

Har*_*ann 13

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

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

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

请参阅CDI规范中的Typesafe分辨率.

  • 是否可以给出一个Binding和Non-binding的例子,并说明它是如何不同的.那将是非常有帮助的 (3认同)