如何在Spring XML文件中声明Java 8方法引用?

Kkk*_*kev 8 java lambda spring java-8

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

例如,假设我有:

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

class Bar {
    long getSize() { ... }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Edw*_*rzo 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));    
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我可以定义一个 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>
Run Code Online (Sandbox Code Playgroud)

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