首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在spring中使用Java8 Lambda函数

在spring中使用Java8 Lambda函数
EN

Stack Overflow用户
提问于 2015-06-26 21:26:06
回答 2查看 5.2K关注 0票数 12

假设我有这门课:

代码语言:javascript
复制
public class FooToBarTransformer {
    public Bar transform(Foo foo) {
        // do some cool stuff
    }
}

我想将它作为一个Function在其他类中使用:

代码语言:javascript
复制
public class Thing {
    public Thing(Function<Foo, Bar> f) {
        this.converter = f;
    }
}

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

代码语言:javascript
复制
FooToBarTransformer transformer = new FooToBarTransformer();
new Thing((foo) -> transformer.transform(foo));
// or new Thing(transformer::transform);

我的问题是,我需要通过Thing 创建一个

代码语言:javascript
复制
<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中执行执行的其他一些方法,我尝试了value="#{(foo) -> fooToBarTransformer.transform(foo)}"value="#{fooToBarTransformer::transform}",但是spring对此感到窒息。

到目前为止,我提出的最佳选择是在代码中提供一个转换函数:

代码语言:javascript
复制
public Function<Foo, Bar> toFunction() {
    return transformer::transform;
}

并在春季用value="#{fooToBarTransformer.toFunction()}"来引用它,但这似乎相当草率。

有更好的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-11-25 03:33:49

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

代码语言:javascript
复制
<bean class="com.myapp.config.FooBarConfiguration"/>

然后,像这样创建类com.myapp.config.FooBarConfiguration

代码语言:javascript
复制
@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>

或者手动将post处理器添加为bean:

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

这应该从Spring3.0和更高版本开始工作,符合http://docs.spring.io/spring/docs/current/javadoc-api/index.html?org/springframework/context/annotation/ConfigurationClassPostProcessor.html。不知道你用的是什么版本。

票数 2
EN

Stack Overflow用户

发布于 2019-09-22 16:56:05

试着使用工厂模式。请参阅org.springframework.beans.factory.FactoryBean.也有春天的表达语言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31082387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档