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)
现在,我已经考虑过一些可能的解决方法,使这更容易:
FooToBarTransformer实施Function,那就简单了ref="fooToBarTransformer" 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()}",但这似乎相当有趣.
有一个更好的方法吗?
我认为你需要做的是切换到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及更高版本开始工作。不确定您使用的是哪个版本。
| 归档时间: |
|
| 查看次数: |
3714 次 |
| 最近记录: |