11

我们在配置 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.一个初始化beanapplicationContext.xml

缺点:永远不会为非 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
        ...
    }
}

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

4

2 回答 2

2
  1. 我会避免static初始化,因为你将来可能有(你的电话不太可能)不需要这种初始化的模块。我不喜欢staticinit。
  2. 这是一种合理的方法,您可以将此初始化放在@Before非弹簧单元测试的一部分中
  3. 与 2. 一样,您可以在您的@Before部分中初始化代码。

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

于 2012-12-18T07:34:25.587 回答
0

我们得出以下结论:

  1. 对于应用程序的运行时,我们FinalClassArgumentCreator在 Wicket Application 类的init()方法中初始化 Lambdaj。这样,几乎可以肯定它们在任何 Lambdaj 使用之前就被初始化了。
  2. 为了测试 Wicket 组件和页面,我们创建了自己的TestApplication类,它使用与生产应用程序相同的初始化代码。
  3. 对于独立的批处理作业,我们决定不使用 Lambdaj。如果我们稍后决定使用它,我们可能会将初始化提取到 Spring 将实例化的类。
于 2012-12-27T06:57:57.043 回答