【发布时间】:2015-12-23 17:16:41
【问题描述】:
我有一个 FXML 控制器,它有一些 Spring Bean 依赖项。由于我使用的是自定义 FXML 加载器,因此我找不到在加载控制器之前及时自动连接它们的方法:
@Bean
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
public UserProfile attachDocController() throws IOException {
return (UserProfile) loadController("/myproject/Forms/userProfile.fxml");
}
FXMLLoader loader = null;
protected Object loadController(String url) throws IOException {
loader = new FXMLLoader(getClass().getResource(url));
loader.load();
return loader.getController();
}
使用这种方法,我只能通过 @Autowired 注释直接注入 bean 来自动装配它们:
public class UserProfile {
@Autowired
MyDependency myDependency;
这让我依赖于 Spring,并在以后给我留下代码可维护性问题。如何将 Spring XML 文件配置中的依赖关系自动装配到 FXML 控制器类中?比如:
<bean id="UserProfile" class="myproject.controllerinjection.UserProfile" scope="prototype">
<aop:scoped-proxy proxy-target-class="true"/>
<property name="myDependency" ref="myDependency" />
</bean>
<bean id="myDependency" class="myproject.controllerinjection.MyDependency" scope="prototype">
<aop:scoped-proxy proxy-target-class="true"/>
</bean>
随着项目变得越来越大,考虑到项目的长期可维护性,这似乎是一条更好的路线。
更新:
我不太习惯 Lambda 表达式。我进行了一些研究,但将@James_D 的建议整合如下:
protected Object loadBeanController(String url) throws IOException {
loader = new FXMLLoader(getClass().getResource(url));
ApplicationContext ctx = WakiliProject.getCtx();
if (ctx != null) {
System.out.println("Load Bean...............");
loader.setControllerFactory(ctx::getBean);
} else {
System.out.println("No App.ctx...............");
}
return loader.getController();
}
每当我尝试调用MyDependency 的方法时都会给出一个空指针。 MyDependency myDependency 永远不会被注入 UserProfile。
【问题讨论】:
-
这对我来说没有多大意义。如果你丢弃
loader.load()的结果,那么控制器将附加到一个永远无法显示的 UI 根目录,所以它没有用。您需要以不同的顺序执行所有这些操作。 -
我想要的是在 Spring XML 配置文件中有这个配置。这可能吗,怎么做?我如何做到这一点并不重要,只要将配置推送到 XML 配置文件即可。
-
当然,解决问题可以让您以任何方式配置应用程序上下文。您想要将其移至 XML 的原因与误解有关,因此如果您进行修复,您可能不再需要/不想将其移至 XML。见答案。
-
请看我上面@James_D的更新
-
在你更新的代码中,你没有调用
loader.load(),所以控制器永远不会被创建,loader.getController()返回null
标签: java xml spring-mvc javafx autowired