【问题标题】:how to declare a Java 8 method reference in a Spring XML file?如何在 Spring XML 文件中声明 Java 8 方法引用?
【发布时间】:2015-06-04 18:12:21
【问题描述】:

我想将 Java 8 方法引用声明为 Spring bean。在 Spring XML 文件中执行此操作的最简单方法是什么?

例如,假设我有:

class Foo {
    Foo(ToLongFunction<Bar> fn) { ... }
}

class Bar {
    long getSize() { ... }
}

...我想创建一个Foo,它将方法引用Bar::getSize 作为构造函数参数。

如何在 Spring bean XML 文件中声明 Foo 实例?

【问题讨论】:

  • 我会说你不...我强烈建议改用基于java的配置..
  • 现在不能选择基于 Java 的配置。
  • 如果您没有得到答案,请调用在您的代码中执行此操作的 spl 方法。
  • 如果您使用的是 Java 8,那么您必须使用 Spring 4。为什么无法使用基于 Java 的配置?

标签: java spring lambda java-8


【解决方案1】:

我在下面提出的解决方案可能不是最好的主意,但我发现这个问题很有趣,并决定尝试一下。这是我能想到的最好的了。

我不知道此时是否有办法直接执行此操作(除了定义某种工厂 bean),但您也可以使用动态语言支持来执行此操作,例如使用 Groovy。

以下示例使用最新版本的 Spring(截至今天 4.1.6)为我运行

假设一个像这样的豆子

public class Foo {

    private Function<String, String> task;

    @Autowired
    public Foo(Function<String, String> task){
        this.task = task;
    }

    public void print(String message) {
        System.out.println(task.apply(message));    
    }

}

然后我可以定义一个 XML 配置,例如:

<lang:groovy id="func">
    <lang:inline-script>
        <![CDATA[
                import java.util.function.Function
                { text -> "Hello " + text } as Function
        ]]>
    </lang:inline-script>
</lang:groovy>

<bean id="foo" class="demo.services.Foo">
    <constructor-arg name="task" ref="func"/>
</bean>

当然,您的 lambda 语法将取决于您选择的语言。我不知道 Groovy 是否有类似方法引用的东西,但是任何方法引用都可以像我上面那样用 lambda/closure 来表示。

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-07-27
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多