11

Java 8::仅通过方法名称启用方法引用。

protected Object loadBeanController(String url) throws IOException {
    loader = new FXMLLoader(getClass().getResource(url));
    ApplicationContext context = MyProjectClass.getApplicationContext();

    loader.setControllerFactory(context::getBean);

    return loader.getController();
}

但是,根据BeanFactory 接口(Spring)getBean() getBean不接受空参数 - 一些参数值是预期的:

getBean(String name)
getBean(String name, Class requiredType)
getBean(String name, Object[] args)

这是如何解决的?

4

1 回答 1

15

JavaFX 的FXMLLoader方法setControllerFactory接受一个Callbackas 参数。

这是一个函数式接口,其唯一方法是call采用一个参数并返回一个结果。在这种情况下,参数的类型是Callback<Class<?>, Object>。所以 lambda 表达式需要一个类型为 的参数Class<?>

因此,实际上,您引用的任何方法都不会被调用。将被调用的是getBean(Class<T> requiredType)(此方法仅在 Spring 3.0 之后存在,因此您不会在链接的 2.5.4 参考中看到它)。

可以像这样重写方法表达式以使其更清楚:

loader.setControllerFactory(c -> context.getBean(c));

在这里,c将具有类型Class<?>,因为声明的参数为setControllerFactory.

附带说明一下,一切都会编译,因为setControllerFactory期望回调的结果是类型Object,所以结果context.getBean(c)总是匹配的。

于 2015-09-26T12:11:59.300 回答