我们在配置 lambdaj 以使用 Joda Time 时遇到问题。由于 LocalDate
是 final 类,Lambdaj 需要像下面这样初始化:( see bug 70 )
public class LocalDateArgumentCreator implements FinalClassArgumentCreator<LocalDate> {
private final long MSECS_IN_DAY = 1000L * 60L * 60L * 24L;
public LocalDate createArgumentPlaceHolder(int seed) {
return new LocalDate((long)seed * MSECS_IN_DAY);
}
}
ArgumentsFactory.registerFinalClassArgumentCreator(LocalDate.class, new LocalDateArgumentCreator());
由于我们需要将此配置应用到几乎所有地方,因此我们缺乏如何实现此配置的选项。我们的应用程序是基于 Spring 和 Wicket 的 Web 应用程序。
我提出了三种不同的选择:
1。核心 maven 模块中的静态初始化 block
由于核心模块包含在所有其他模块中,因此所有模块都将包含该类。剩下的问题是,即使没有对目标类的引用,静态 block 总是会被初始化吗?
例子
public final class LambdajInitializer {
static {
// initialize like above
}
}
2。 applicationContext.xml
中的一个初始化 bean
缺点:永远不会为非 Spring 测试初始化
示例:在 applicationContext-core.xml 中(包含在每个模块中)
<bean class="...LambdajInitializer" />
public class LambdajInitializer {
@PostConstruct
public void init() {
// Lambdaj initialization
}
}
3。调用 Wicket 应用程序类中的初始化方法
缺点:永远不会在 web 模块之外初始化
public class MyApplication extends WebApplication {
@Override
public void init() {
...
// Lambdaj initialization
...
}
}
我的问题是:实现这一目标的最佳方法是什么?
最佳答案
- 我会避免
static
初始化,因为您将来可能拥有(您的调用可能性不大)不需要这种初始化的模块。我不喜欢static
初始化。 - 这是一种合理的方法,您可以将此初始化放在非 Spring 单元测试的
@Before
部分中 - 与 2. 一样,您可以在
@Before
部分中初始化代码。
选项 4。您可以创建一个仅用于测试的 Spring 配置类/文件,并使用 @ContextConfiguration
关于java - Lambdaj FinalClassArgumentCreators 的应用程序范围的配置。在哪里以及如何做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821380/