我正在尝试结合使用 CDI (weld-se 2) 和 JavaFX,并且我想使用自定义创建的注释来注释我的 Controller 类,以便使用我的工厂方法管理此类创建。我想应该如下所示,但这段代码不起作用。您能否建议应该更改哪些内容?
注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
@Qualifier
public @interface FXMLManaged {
}
工厂类:
public class FXMLManagedProducer {
@Produces @FXMLManaged
public <T> T getFXMLManagedInstance(Class<T> type) {
return type.newInstance();
}
}
Controller 类:
@FXMLManaged
public class NewsListView {
}
最佳答案
您似乎将 CDI Extensions 与生产者混合在一起。首先,如果你想有一个生产者,工厂方法应该返回一个 NewsListView
,而不是一个泛型类型。将 @Producer
与限定符注释一起使用将与注释类型绑定(bind)。所以不需要用@FXMLManaged
注解NewsListView
。然后将 NewsListView
注入(inject) bean 中的某处。
生成 View :
public class FXMLManagedProducer {
@Produces @FXMLManaged
public NewsListView getFXMLManagedInstance() {
return new NewsListView();
}
}
使用生产者:
public class SomeBean {
@Inject @FXMLManaged
NewsListView view;
}
但我猜这不是您要找的。我想你可能想创建一个 CDI Extension
public class YourExtension implements Extension {
<T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
if(pat.getAnnotatedType().isAnnotationPresent(FXMLManaged.class)) {
// do your stuff here
}
}
}
这样您就可以处理带注释的 NewsListView
。您可能想看看其他挂接到生命周期的方法,这样您就可以创建 bean 并在必要时注入(inject)依赖项。
关于java - @Produce 方法的正确使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18060554/