gpt4 book ai didi

java - 在 spring XML 中使用 Java8 Lambda 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:48 24 4
gpt4 key购买 nike

假设我有这个类(class):

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);

我的问题是,我需要通过 spring 创建一个 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 实现的不同接口(interface),并更改 Thing 以获取该接口(interface)的实例而不是 Function。就这个问题而言,这些都不是选项。

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

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

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

并在 Spring 用 value="#{fooToBarTransformer.toFunction()}" 引用它,但这看起来相当虚伪。

有更好的方法吗?

最佳答案

我认为您需要做的是切换到 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 及更高版本开始工作.不确定您使用的是哪个版本。

关于java - 在 spring XML 中使用 Java8 Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31082387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com