java - @Produce 方法的正确使用方法

标签 java javafx-2 cdi jboss-weld

我正在尝试结合使用 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/

相关文章:

java - 用于更新 Maven 索引的 Eclipse 连接挂起

java - 即使对于高堆大小分配,Jmeter 也会测试内存不足错误

java - 使用 GroovyFX 实现新的 JavaFX 组件?

java - 如果您使用基于界面的设计方法,您如何命名更多行为界面?

java - 是否指定 @Transactional rollbackFor 还包括 RuntimeException

JavaFX ScrollPane 以编程方式移动视口(viewport) - 居中内容

java - 如何向 MAC App Store 提交 JavaFX 应用程序?

java - 使用代码而不是 beans.xml 注入(inject) @alternative bean

object - 如何获取特定 cdi session 范围 bean 的所有实例

java - 在 CDI SessionScoped bean 中注入(inject) HttpServletRequest