使用@Produce方法的正确方法

Sla*_*lam 3 java cdi jboss-weld javafx-2

我正在尝试将CDI(weld-se 2)和JavaFX结合起来,我想用自定义创建的注释来注释我的控制器类,因此使用我的工厂方法来管理这个类创建.我想这应该如下所示,但这段代码不起作用.你能告诉我应该改变什么吗?

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
@Qualifier
public @interface FXMLManaged {
}
Run Code Online (Sandbox Code Playgroud)

工厂类:

public class FXMLManagedProducer {
    @Produces @FXMLManaged
    public <T> T getFXMLManagedInstance(Class<T> type) {
        return type.newInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器类:

@FXMLManaged
public class NewsListView {
}
Run Code Online (Sandbox Code Playgroud)

tho*_*ens 5

您似乎将CDI Extensions与生产者混合在一起.首先,如果您想拥有一个生产者,那么工厂方法应该返回一个NewsListView而不是泛型类型.使用@Producer连同预选赛注释将与注释类型进行绑定.所以,没有必要标注NewsListView@FXMLManaged.然后你将你的NewsListView某个地方注入一个豆子里.

制作视图:

public class FXMLManagedProducer {
    @Produces @FXMLManaged
    public NewsListView getFXMLManagedInstance() {
        return new NewsListView();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用制作人:

public class SomeBean {
    @Inject @FXMLManaged
    NewsListView view;
}
Run Code Online (Sandbox Code Playgroud)

但我的猜测是,这不是你想要的.我想你可能想要创建一个CDI扩展

public class YourExtension implements Extension {

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
        if(pat.getAnnotatedType().isAnnotationPresent(FXMLManaged.class)) {
            // do your stuff here
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以处理注释了NewsListView.您可能希望了解其他方法以挂钩生命周期,因此您可以创建bean并在必要时注入依赖项.