使用@Produce方法的正确方法

时间:2013-08-05 14:20:32

标签: java javafx-2 cdi jboss-weld

我正在尝试将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 {
}

2 个答案:

答案 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/