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

2022-09-02 09:43:32

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

我还在getDefaultInstance(props,authenticator)上阅读了Java文档,但仍然无法明显/清楚地看出区别。

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

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


答案 1

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

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

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

getInstance获取新的会话对象。

因此,将创建一个新的会话对象,而不管一个是否已存在。


答案 2

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

问:我应该什么时候使用,什么时候应该使用?Session.getDefaultInstanceSession.getInstance

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


推荐