假设我有这门课程:
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>
现在,有一些可行的解决方法我认为可以让这更容易:
FooToBarTransformer
已实施Function
,那么它只是一个简单的ref="fooToBarTransformer"
FooToBarTransformer
实现的不同界面,并更改Thing
以获取该界面的实例而不是Function
。出于这个问题的目的,这些都不是选择。基于我在spring xml中看到过执行的其他一些方法,我已经尝试了value="#{(foo) -> fooToBarTransformer.transform(foo)}"
和value="#{fooToBarTransformer::transform}"
但是春天对此感到窒息。
我到目前为止提出的最佳选择是在代码中提供翻译功能:
public Function<Foo, Bar> toFunction() {
return transformer::transform;
}
并在春天用value="#{fooToBarTransformer.toFunction()}"
引用它,但这看起来相当不错。
有更好的方法吗?
答案 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。 春天也有表达语言。