我正在阅读JavaEE 7中的CDI
次注入,特别是使用@Qualifier
和@Produces
将custom 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;
我的问题是:
@Nonbinding
注释的含义是什么?为什么需要呢?
方法签名是否应始终如此@Nonbindng public String value();
。我问这个的原因是我看过几个不同的例子,但它们都有相同的签名。这是允许的:
public @interface HttpParam { @Nonbinding public int value(); }
public @interface HttpParam { @Nonbinding public String value(); @Nonbinding public int value1(); }
由于
答案 0 :(得分:13)
默认情况下,考虑使用限定符参数将bean限定符与注入点限定符进行匹配。不考虑@Nonbinding
参数进行匹配。
在这种情况下,producer方法生成的bean具有限定符@HttpParam("")
。如果参数具有约束力(即不是@Nonbinding
),则@HttpParam("")
与注入点上的@HttpParam("username")
不匹配。
您可以拥有任意数量的限定符参数,绑定或非绑定。
请参阅CDI规范中的Typesafe resolution。