假设我有这门课:
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中执行执行的其他一些方法,我尝试了value="#{(foo) -> fooToBarTransformer.transform(foo)}"和value="#{fooToBarTransformer::transform}",但是spring对此感到窒息。
到目前为止,我提出的最佳选择是在代码中提供一个转换函数:
public Function<Foo, Bar> toFunction() {
return transformer::transform;
}并在春季用value="#{fooToBarTransformer.toFunction()}"来引用它,但这似乎相当草率。
有更好的方法吗?
发布于 2015-11-25 03:33:49
我认为您需要做的是同时切换到Java (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>
或者手动将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。不知道你用的是什么版本。
发布于 2019-09-22 16:56:05
试着使用工厂模式。请参阅org.springframework.beans.factory.FactoryBean.也有春天的表达语言。
https://stackoverflow.com/questions/31082387
复制相似问题