我知道JAXBContext应该只创建一次,因为它相当昂贵,但是我很好奇是否为所有必需的类创建一个上下文,

JAXBContext newInstance(Class... classesToBeBound)


还是将所有上下文保存在地图中并创建(如果尚未创建)?

Map<Class, JAXBContext> map = new HashMap<>();

public JAXBContext getContext(Class clazz) {
    if (map.get(clazz) == null) {
        map.put(clazz, JAXBContext.newInstance(clazz));
    }
    return map.get(clazz);
}

最佳答案

我永远无法理解为什么人们每个班级甚至几个班级都创建JAXBContext

我更喜欢为特定的上下文路径创建JAXBContext,通常是一个或多个与我需要使用的单个模式相对应的程序包。然后,我可以将其用于这些包中的所有类,并且它还涵盖更复杂的情况,例如替代组。

所以:

JAXBContext context = JAXBContext.newInstance("com.acme.foo:org.terra.bar");


如果要使其基于类,那么每个包将创建一个JAXBContext。还要考虑多线程访问,以便没有两个线程可以并行创建两个JAXBContexts

10-07 15:16