在Spring XML中使用Java8 Lambda函数

Kre*_*ase 9 java lambda spring java-8

假设我有这个课程:

public class FooToBarTransformer {
    public Bar transform(Foo foo) {
        // do some cool stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我想Function在其他类中使用它:

public class Thing {
    public Thing(Function<Foo, Bar> f) {
        this.converter = f;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我Thing通过Java 实例化,我会用Java8 Lambdas这样做:

FooToBarTransformer transformer = new FooToBarTransformer();
new Thing((foo) -> transformer.transform(foo));
// or new Thing(transformer::transform);
Run Code Online (Sandbox Code Playgroud)

我的问题是,我需要创造一个Thing虽然春天.

<bean id="fooToBarTransformer" class="com.mypackage.FooToBarTransformer"/>
<bean id="theThing" class="com.mypackage.Thing">
    <constructor-arg index="0" ????????? />
</bean>
Run Code Online (Sandbox Code Playgroud)

现在,我已经考虑过一些可能的解决方法,使这更容易:

  1. 如果FooToBarTransformer实施Function,那就简单了ref="fooToBarTransformer"
  2. 我可以创建一个不同的接口来FooToBarTransformer实现和更改Thing以获取该接口的实例而不是Function.出于这个问题的目的,这些都不是选择.

根据我在春季xml中看到过执行执行的其他一些方法,我已经尝试过value="#{(foo) -> fooToBarTransformer.transform(foo)}",value="#{fooToBarTransformer::transform}"但是春天对此窒息了.

我到目前为止提出的最佳选择是在代码中提供翻译功能:

public Function<Foo, Bar> toFunction() {
    return transformer::transform;
}
Run Code Online (Sandbox Code Playgroud)

并在春天引用它value="#{fooToBarTransformer.toFunction()}",但这似乎相当有趣.

有一个更好的方法吗?

Uli*_*ses 2

我认为你需要做的是切换到Java配置(http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-java)同时,如果可以的话不切换,你仍然可以通过组合方法来实现它。在 XML 配置文件中添加:

<bean class="com.myapp.config.FooBarConfiguration"/>
Run Code Online (Sandbox Code Playgroud)

然后,您创建com.myapp.config.FooBarConfiguration这样的类:

@Configuration
public class FooBarConfiguration {
    @Bean
    public FooToBarTransformer fooTransformer() {
        return new FooToBarTransformer();
    }

    @Bean
    public Thing theThing(FooToBarTransformer fooTransformer) {
        return new Thing(fooTransformer::transform);
    }
}
Run Code Online (Sandbox Code Playgroud)

只需确保它ConfigurationClassPostProcessor是 Spring 上下文中注册的后处理器,方法是:

<context:annotation-config>

或者

<context:component-scan>

或者通过手动将后处理器添加为 bean:

<bean class="org.springframework.context.annotation.ConfigurationClassPostProcessor"/>

根据http://docs.spring.io/spring/docs/current/javadoc-api/index.html?org/springframework/context/annotation/ConfigurationClassPostProcessor.html ,这应该从Spring 3.0及更高版本开始工作。不确定您使用的是哪个版本。

  • 问题是关于 xml 配置 - 切换到 Java 配置(imo)不是一个有效的答案:( (7认同)