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(属性)的文档中。