Lambdaj FinalClassArgumentCreators的应用程序范围配置.在哪里以及如何做到这一点?

RJo*_*RJo 11 java spring static static-initialization lambdaj

我们在配置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());
Run Code Online (Sandbox Code Playgroud)

由于我们需要在几乎所有地方应用此配置,因此我们缺乏如何实现此配置的选项.我们的应用程序是基于Spring和Wicket的Web应用程序.

我提出了三种不同的选择:

1.核心maven模块中的静态初始化块

由于核心模块包含在每个其他模块中,因此所有模块都包含该类.剩下的问题是,即使没有对目标类的引用,静态块总是会被初始化吗?

public final class LambdajInitializer {
    static {
        // initialize like above
    }
}
Run Code Online (Sandbox Code Playgroud)

2.初始化bean applicationContext.xml

缺点:从未对非Spring测试进行初始化

示例:在applicationContext-core.xml中(包含在每个模块中)

<bean class="...LambdajInitializer" />

public class LambdajInitializer {
    @PostConstruct
    public void init() {
        // Lambdaj initialization
    }
}
Run Code Online (Sandbox Code Playgroud)

3.在Wicket应用程序类中调用初始化方法

缺点:永远不会在Web模块之外进行初始化

public class MyApplication extends WebApplication {
    @Override
    public void init() {
        ...
        // Lambdaj initialization
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

RJo*_*RJo 0

我们得出以下结论:

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