Session.getDefaultInstance(props, authenticator)
とgetInstance(props, authenticator)
の違いは何ですか?一般的に、いつどちらを選択しますか?
Java doc on getDefaultInstance(props、authenticator) も読みましたが、それでも違いを明確に/明確に理解することができませんでした。
専門家がこれをよりよく理解するのを手伝ってくれることを願っています。
UPDATE:この質問をするきっかけとなった実際の理由は次のとおりです:Webベースのいくつかの場所でSession.getDefaultInstance()
メソッドを使用しました応用。時々、それは_Java.lang.SecurityException: Access to default session denied
_をスローし、クイックグーグルで、代わりにSession.getInstance()
メソッドを使用することを提案しました。したがって、どちらか一方を選択するのはいつですか?
ドキュメントを読むと、次のことがわかります。
getDefaultInstanceデフォルトのSessionオブジェクトを取得します。デフォルトがまだ設定されていない場合は、新しいSessionオブジェクトが作成され、デフォルトとしてインストールされます。
したがって、まだ存在しない場合は、getInstance()を呼び出します。
getInstance新しいSessionオブジェクトを取得します。
そのため、セッションオブジェクトがすでに存在するかどうかに関係なく、新しいセッションオブジェクトが作成されます。
FAQによると: https://javaee.github.io/javamail/FAQ#getdefaultinstance
Q:いつ
Session.getDefaultInstance
を使用する必要があり、いつSession.getInstance
を使用する必要がありますか?A:ほとんどすべてのコードで
Session.getInstance
を使用する必要があります。Session.getDefaultInstance
メソッドは、渡されたプロパティを使用して、最初に呼び出されたときに新しいセッションを作成します。後続の呼び出しはその元のセッションを返し、渡したプロパティを無視します。異なるプロパティで異なるセッションを作成する場合、Session.getDefaultInstanceはそれを行いません。同じJVM内(同じアプリサーバー内など)の他のコードが、それらのプロパティを使用してデフォルトのセッションを既に作成している場合、それらのセッションを使用することになり、プロパティは無視されます。これは、プロパティ設定が無視されているように見える理由を説明することがよくあります。 この問題を回避するには、常にSession.getInstance
を使用してください。
原因このエラーは、javax.mail.Session.JavaのgetDefaultInstanceメソッドで発生します。このソースコードによると、このエラーは、デフォルトのセッションオブジェクトがすでに初期化されているが、オーセンティケータインスタンスが更新または変更された場合、またはデフォルトのセッションオブジェクトのクラスローダーが引数オーセンティフィケータのものと異なる場合に発生します。たぶん、Java Javaメールのデフォルトセッションインスタンスを使用するソースコードが再コンパイルされて再ロードされるか、重複するjavamailクラスライブラリが環境のクラスパスに含まれます。適切な解決策を提供します
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()
-シングルトンのように見えます。
ドキュメントが言ったように:
また、Propertiesオブジェクトは、このメソッドが最初に呼び出されたとき、新しいSessionオブジェクトが作成されたときにのみ使用されることにも注意してください。後続の呼び出しは、最初の呼び出しによって作成されたSessionオブジェクトを返し、渡されたPropertiesオブジェクトを無視します。 getInstanceメソッドを使用して、メソッドが呼び出されるたびに新しいSessionオブジェクトを取得します。