【问题标题】:Using a Java8 Lambda Function inside spring XML在 Spring XML 中使用 Java8 Lambda 函数
【发布时间】:2015-06-26 21:26:06
【问题描述】:

假设我有这个课程:

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 Lambda 来实现,如下所示:

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

我的问题是我需要创建一个 Thing 虽然是 spring

<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。就本问题而言,这些都不是选项。

基于我在 spring xml 中执行的其他一些执行方式,我尝试了 value="#{(foo) -&gt; fooToBarTransformer.transform(foo)}"value="#{fooToBarTransformer::transform}",但 spring 对此感到窒息。

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

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

并在春季使用value="#{fooToBarTransformer.toFunction()}" 引用它,但这似乎相当不成熟。

有更好的方法吗?

【问题讨论】:

  • 旁注:new Thing(transformer::transform);
  • 基本上,你不能。目前没有支持它的符号。
  • 嘘。好吧,至少这是一个答案,而不是我永远想知道......
  • 为什么你的FooToBarTransformer 不能实现Function&lt;Foo,Bar&gt;?您只需添加public Bar apply(Foo foo){return transform(foo);} 即可。

标签: java spring lambda java-8


【解决方案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 上下文中的注册后处理器,方法是:

&lt;context:annotation-config&gt;

或者

&lt;context:component-scan&gt;

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

&lt;bean class="org.springframework.context.annotation.ConfigurationClassPostProcessor"/&gt;

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

【讨论】:

  • 问题是关于 xml 配置 - 切换到 Java 配置是 (imo) 不是一个有效的答案:(
【解决方案2】:

尝试使用工厂模式。请参阅 org.springframework.beans.factory.FactoryBean。 spring也有表达语言。

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2019-10-13
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多