Session类中的getDefaultInstance()和getInstance()有什么区别?

Gna*_*nam 16 java session jakarta-mail

Session.getDefaultInstance(props, authenticator)和之间有什么区别getInstance(props, authenticator)?一般来说,你何时会选择一个而不是另一个?

我还在getDefaultInstance(props,authenticator)上阅读了Java doc ,但仍然无法清楚地/清楚地看出差异.

希望专家可以帮助我更好地理解这一点.

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

Cod*_*nci 19

如果你阅读文档,你会看到

getDefaultInstance 获取默认的Session对象.如果尚未设置默认值,则会创建一个新的Session对象并将其安装为默认值.

因此,如果尚不存在,则调用getInstance()

getInstance 获取一个新的Session对象.

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

  • 使用getDefaultInstance的一个非常重要的副作用是,如果已经创建了会话,那么您传入的属性将被忽略.现有的会话属性不会以任何方式更新,因此如果您要更改要使用getInstance的任何属性. (5认同)
  • @Gnanam,是的,但是它使用跨JVM的共享实例(在文档中的行之间读取,表示会话可以在桌面上共享).因此,这可能是他收到错误的原因,即它使用共享实例并使用错误的凭据访问它.因此,为了防止错误,不使用getDefaultInstance()更安全. (3认同)
  • 现在,[JAVAMAIL API 常见问题](http://www.oracle.com/technetwork/java/javamail/faq/index.html#getdefaultinstance) 中对此进行了介绍。 (3认同)

Yas*_*muş 5

常见问题说:https : //javaee.github.io/javamail/FAQ#getdefaultinstance

Q:什么时候用Session.getDefaultInstance,什么时候用Session.getInstance

A:几乎所有的代码都应该使用Session.getInstance. 该 Session.getDefaultInstance方法在第一次被调用时使用传递的属性创建一个新会话。后续调用将返回原始会话并忽略您传入的任何属性。如果您想创建具有不同属性的不同会话,Session.getDefaultInstance 不会这样做。如果同一 JVM 中的其他代码(例如,在同一应用服务器中)已经使用它们的属性创建了默认 Session,您可能最终会使用它们的 Session 并且您的属性将被忽略。这通常解释了为什么您的属性设置似乎被忽略了。始终使用 Session.getInstance以避免此问题。