我正在尝试将CDI(weld-se 2)和JavaFX结合起来,我想用自定义创建的注释来注释我的控制器类,因此使用我的工厂方法来管理这个类创建。我想这应该如下所示,但这段代码不起作用。你能告诉我应该改变什么吗?
注释:
@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();
}
}
控制器类:
@FXMLManaged
public class NewsListView {
}
答案 0 :(得分:5)
您似乎将CDI Extensions与制作人混在一起。首先,如果您想拥有一个生产者,那么工厂方法应返回NewsListView
,而不是泛型类型。使用@Producer
以及限定符注释将与带注释的类型绑定。因此,无需使用NewsListView
注释@FXMLManaged
。然后你将NewsListView
注入bean的某个地方。
制作视图:
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并在必要时注入依赖项。
答案 1 :(得分:1)
首先,您需要创建一个Weld-Container来使用CDI。以下是一些例子:
http://java.dzone.com/articles/fxml-javafx-powered-cdi-jboss http://blog.matthieu.brouillard.fr/2012/08/fxml-javafx-powered-by-cdi-jboss-weld_6.html
正在开发的JavaFX正在进行中的CDI API。它将成为DataFX的一部分。你可以在这里找到一些新闻:
http://www.guigarage.com/2013/05/designing-javafx-business-applications-part-2/