在Spring XML中使用Java8 Lambda函数

时间:2015-06-26 21:26:07

标签: java spring lambda java-8

假设我有这门课程:

public class FooToBarTransformer {
    public Bar transform(Foo foo) {
        // do some cool stuff
    }
}

我希望在其他课程中将其作为Function使用:

public class Thing {
    public Thing(Function<Foo, Bar> f) {
        this.converter = f;
    }
}

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

FooToBarTransformer transformer = new FooToBarTransformer();
new Thing((foo) -> transformer.transform(foo));
// or new Thing(transformer::transform);

我的问题是,我需要创建Thing虽然是春天

<bean id="fooToBarTransformer" class="com.mypackage.FooToBarTransformer"/>
<bean id="theThing" class="com.mypackage.Thing">
    <constructor-arg index="0" ????????? />
</bean>

现在,有一些可行的解决方法我认为可以让这更容易:

  1. 如果FooToBarTransformer已实施Function,那么它只是一个简单的ref="fooToBarTransformer"
  2. 我可以创建FooToBarTransformer实现的不同界面,并更改Thing以获取该界面的实例而不是Function。出于这个问题的目的,这些都不是选择。
  3. 基于我在spring xml中看到过执行的其他一些方法,我已经尝试了value="#{(foo) -> fooToBarTransformer.transform(foo)}"value="#{fooToBarTransformer::transform}"但是春天对此感到窒息。

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

    public Function<Foo, Bar> toFunction() {
        return transformer::transform;
    }
    

    并在春天用value="#{fooToBarTransformer.toFunction()}"引用它,但这看起来相当不错。

    有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我认为您需要做的是切换到Java Config(http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-java) 与此同时,如果您无法切换,您仍然可以通过组合方法将其拉出来。在您的XML配置文件中添加:

<bean class="com.myapp.config.FooBarConfiguration"/>

然后,您可以像这样创建类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);
    }
}

通过以下方式确保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及更高版本。不确定您使用的版本。

答案 1 :(得分:0)

尝试使用工厂模式。参见org.springframework.beans.factory.FactoryBean。 春天也有表达语言。