我们在配置lambdaj以使用Joda Time时遇到问题。由于LocalDate
是最后一个类,Lambdaj需要初始化如下:(参见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模块中的静态初始化块
由于核心模块包含在其他模块中,因此所有模块都将包含该类。剩下的问题是,即使没有对目标类的引用,静态块是否总是被初始化?
示例
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
inits - 这是一种合理的方法,您可以将此初始化放在非spring单元测试的
@Before
部分中 - 与2.类似,您可以在
@Before
部分中初始化代码
选项4。您可以创建一个仅限测试的Spring配置类/文件,并使用@ContextConfiguration
将其传递给您的测试
我们得出以下结论:
- 对于应用程序的运行时,我们在Wicket application类的
init()
方法中初始化Lambdaj的FinalClassArgumentCreator
s。通过这种方式,它们几乎可以肯定是在任何Lambdaj使用之前初始化的 - 为了测试Wicket组件和页面,我们创建了自己的
TestApplication
类,该类使用与生产应用程序相同的初始化代码 - 对于独立的批处理作业,我们决定不使用Lambdaj。如果我们稍后决定使用它,我们可能会提取Spring将实例化的类的初始化