3

我正在使用 JAXB 2.0 版本。为此,我JAXBContext通过以下方式创建对象:

package com;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class JAXBContextFactory {

    public static JAXBContext createJAXBContext() throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);

        return jaxbContext;
    }

}

基本上由于创建 JAXBContext 非常昂贵,我想JAXBContext 为整个应用程序创建一次且仅一次。所以我把JAXBContext代码放在静态方法下,如上图所示。

现在,请求将JAXBContextFactory.createJAXBContext();在需要引用时调用JAXBContex. 现在我的问题是,在这种情况下是JAXBContext只创建一次还是应用程序有多个实例JAXBContext

4

5 回答 5

5

每次调用此方法时,您的应用程序都会有一个 JAXBContext 实例。

如果您不希望这种情况发生,则需要执行以下操作

package com;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class JAXBContextFactory {

    private static JAXBContext context = null;
    public static synchronized JAXBContext createJAXBContext() throws JAXBException {
        if(context == null){
            context = JAXBContext.newInstance(Customer.class);
        }
        return context;
    }

}

这与您的实现之间的区别在于,在这一实现中,我们保存了在静态变量中创建的 JAXBContext 实例(保证仅存在一次)。在您的实现中,您不会将刚刚创建的实例保存在任何地方,并且只会在每次调用该方法时创建一个新实例。重要提示:不要忘记synchronized添加到方法声明中的关键字,因为它确保在多线程环境中调用此方法仍将按预期工作。

于 2012-06-13T15:13:02.177 回答
3

您的实现将为对它的每个请求创建一个新的 JAXBContext。相反,您可以这样做:

public class JAXBContextFactory {
    private static JAXBContext jaxbContext;

    static {
        try {
            jaxbContext = JAXBContext.newInstance(Customer.class);
        } catch (JAXBException ignored) {
        }
    }

    public static JAXBContext createJAXBContext() {
        return jaxbContext;
    }

}
于 2012-06-13T15:13:19.733 回答
3

每次调用您的方法时,它都会清楚地创建一个新的 JAXBContext。

如果您想确保只创建一个实例,而不管您的方法被调用多少次,那么您正在寻找Singleton Pattern,其实现如下所示:

public class JAXBContextFactory {
  private static JAXBContext INSTANCE;
  public static JAXBContext getJAXBContext() throws JAXBException {
    if (JAXBContextFactory.INSTANCE == null) {
      INSTANCE = JAXBContext.newInstance(Customer.class);
    }
    return INSTANCE;
  }
}

请记住,此实例仅在每个 Java 类加载器中都是唯一的。

于 2012-06-13T15:14:05.280 回答
2

每次调用该方法时,您将拥有一个实例。使用static上下文只是意味着您没有任何实例JAXBContextFactory

也许您使用的是

public enum JAXBContextFactory {;

    private static JAXBContext jaxbContext = null;

    public synchronized static JAXBContext createJAXBContext() throws JAXBException {
        if (jaxbContext == null)
            jaxbContext = JAXBContext.newInstance(Customer.class);
        return jaxbContext;
    }

}
于 2012-06-13T15:13:31.567 回答
0

在分析了其他答案和@tom-hawtin-tackline 评论后,我认为最简单的解决方案是:

public class JAXBContextFactory {

    private static final JAXBContext CONTEXT = createContext();

    private static JAXBContext createContext() {
        try {
            return JAXBContext.newInstance(Customer.class);
        } catch (JAXBException e) {
            throw new AssertionError(e);
        }
    }

    public static JAXBContext getContext() { return CONTEXT; }

}
于 2013-11-07T19:54:12.213 回答