Java 会话类中的getDefaultInstance()和getInstance()之间有什么区别?

Java 会话类中的getDefaultInstance()和getInstance()之间有什么区别?,java,session,jakarta-mail,Java,Session,Jakarta Mail,Session.getDefaultInstance(props,authenticator)和getInstance(props,authenticator)之间有什么区别?一般来说,你什么时候会选择其中一个 我还在上读了Java文档,但仍然不能清楚地/清楚地看出区别 希望专家能帮助我更好地理解这一点 更新:触发此问题的实际原因是:我们在基于web的应用程序中的某些地方使用了Session.getDefaultInstance()方法。有时,它抛出java.lang.SecurityExcep

Session.getDefaultInstance(props,authenticator)
getInstance(props,authenticator)
之间有什么区别?一般来说,你什么时候会选择其中一个

我还在上读了Java文档,但仍然不能清楚地/清楚地看出区别

希望专家能帮助我更好地理解这一点


更新:触发此问题的实际原因是:我们在基于web的应用程序中的某些地方使用了
Session.getDefaultInstance()
方法。有时,它抛出
java.lang.SecurityException:Access to default session denied
,在快速搜索时,它建议使用
session.getInstance()
方法。因此,当一方选择一方而不是另一方时?

如果您阅读文档,您将看到

getDefaultInstance 获取默认会话对象。如果尚未设置默认值,则会创建一个新的会话对象并作为默认值安装

因此,如果一个实例不存在,它将调用getInstance()

getInstance 获取一个新的会话对象

因此,无论会话对象是否已经存在,都会创建一个新的会话对象。

原因 此错误在javax.mail.Session.java中的getDefaultInstance方法中引发。根据此源代码,当默认会话对象已初始化,但验证器实例已更新或更改,或者默认会话对象的类加载器与参数authentificator不同时,会发生此错误。可能会重新编译并重新加载使用java mail的默认会话实例的java源代码,或者在环境的类路径中包含重复的java mail类库。 它给出了适当的解决方案

javax.mail.Session.java file
   public static synchronized Session getDefaultInstance(Properties props,
                                       Authenticator authenticator) {
       if (defaultSession == null)
           defaultSession = new Session(props, authenticator);
       else {
           // have to check whether caller is allowed to see default session
           if (defaultSession.authenticator == authenticator)
               ;       // either same object or both null, either way OK
           else if (defaultSession.authenticator != null &&
                   authenticator != null &&
                   defaultSession.authenticator.getClass().getClassLoader() ==
                       authenticator.getClass().getClassLoader())
               ;       // both objects came from the same class loader, OK
           else
               // anything else is not allowed
               throw new SecurityException("Access to default session denied");
       }

       return defaultSession;
   }

对我来说,使用
getInstance()
而不是
getDefaultInstance()
是非常重要的

因为在更改邮件会话属性后,邮件会话仍在存储旧属性

所以
getDefaultInstance()
-它看起来像是Singleton

正如docs所说:

还请注意,只有在创建新会话对象时第一次调用此方法时才使用Properties对象。后续调用返回第一次调用创建的会话对象,并忽略传递的属性对象。每次调用该方法时,使用getInstance方法获取新的会话对象

常见问题解答说:

问:我应该什么时候使用会话.getDefaultInstance,什么时候使用 使用会话.getInstance

答:几乎所有代码都应该使用
Session.getInstance
。这个
Session.getDefaultInstance
方法首先创建一个新会话 调用它的时间,使用传递的属性。后来的 调用将返回原始会话,并忽略您创建的任何属性 过去。如果要创建具有不同会话的不同会话 属性,Session.getDefaultInstance不会这样做。如果有别的 同一JVM(例如,同一应用程序服务器)中的代码已经存在 创建了具有其属性的默认会话,您可能会 使用他们的会话和您的属性将被忽略。这经常 解释属性设置似乎被忽略的原因始终使用
Session.getInstance
以避免此问题。


这个医生可能会帮助你理解difference@org.life.java当前位置我找不到任何区别?你能给我指出一些具体的句子/段落吗?
getInstance()
:获取一个新的会话对象
getDefaultInstance()
:获取默认会话对象。如果尚未设置默认值,将创建一个新的会话对象,并将其作为默认值安装。@org.life.java:实时,何时选择一个?在我的例子中,我们有一个基于web的应用程序,在某些上下文/位置会触发电子邮件。在这种情况下建议使用哪种方法?这里解释了提出此问题的实际原因:我们在基于web的应用程序中的某些地方使用了
Session.getDefaultInstance()
方法。有时,它抛出
java.lang.SecurityException:Access to default session denied
,在快速搜索时,它建议使用
session.getInstance()
方法。这就是我在这里问的为什么一个会选择一个而不是另一个?我能看到的使用defaultinstance的唯一原因是,它可以防止不必要地创建多个会话实例的需要,但除此之外没有区别。如果您在权限方面遇到问题,那么只需使用getInstance(),它不会给您带来问题。但是,您的应用程序应该将其存储在全局级别,而不是每次需要时都创建一个新实例。@Gnanam,是的,但它在JVM中使用了一个共享实例(从文档中的行中可以看出,会话可以在桌面上共享)。所以,这可能就是他出错的原因,因为他使用了一个共享实例,并使用错误的凭据访问它。因此,为了防止出现错误,不使用getDefaultInstance()更安全。使用getDefaultInstance的一个非常重要的副作用是,如果会话已经创建,那么传入的属性将被忽略。现有会话属性将不会以任何方式更新,因此,如果您要更改任何属性,则需要使用getInstance。这一点现在已在中介绍。这一关键信息位于getDefaultInstance(属性,验证器)的文档中,而不在getDefaultInstance(属性)的文档中。