Lambdaj FinalClassArgumentCreators的应用范围配置.在哪里以及如何进行



我们在配置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
...
}
}

我的问题是:实现这一目标的最佳方式是什么?

  1. 我会避免static初始化,因为将来可能会有(调用的可能性有多小)模块不需要这种初始化。我不喜欢staticinits
  2. 这是一种合理的方法,您可以将此初始化放在非spring单元测试的@Before部分中
  3. 与2.类似,您可以在@Before部分中初始化代码

选项4。您可以创建一个仅限测试的Spring配置类/文件,并使用@ContextConfiguration将其传递给您的测试

我们得出以下结论:

  1. 对于应用程序的运行时,我们在Wicket application类的init()方法中初始化Lambdaj的FinalClassArgumentCreators。通过这种方式,它们几乎可以肯定是在任何Lambdaj使用之前初始化的
  2. 为了测试Wicket组件和页面,我们创建了自己的TestApplication类,该类使用与生产应用程序相同的初始化代码
  3. 对于独立的批处理作业,我们决定不使用Lambdaj。如果我们稍后决定使用它,我们可能会提取Spring将实例化的类的初始化

最新更新