В чем разница между getDefaultInstance() и getInstance() в классе Session?

В чем разница между Session.getDefaultInstance(props, authenticator) и getInstance(props, authenticator)? В общем, когда вы выберете один за другим?

Я также читал документ Java getDefaultInstance (реквизит, аутентификатор), но все еще не мог четко различить/четко.

Надежды эксперты могут помочь мне в понимании этого лучше.

ОБНОВЛЕНИЕ: Фактическая причина, по которой возникает вопрос: мы использовали метод Session.getDefaultInstance() в некоторых местах нашего веб-приложения. Иногда он бросает java.lang.SecurityException: Access to default session denied, при быстром поисковом рассылке он предлагает вместо этого использовать метод Session.getInstance(). Следовательно, когда вы выбираете один над другим?

Ответы

Ответ 1

Если вы прочтете документацию, вы увидите, что

getDefaultInstance Получить объект Session по умолчанию. Если значение по умолчанию еще не установлено, новый объект сеанса создается и устанавливается по умолчанию.

Поэтому, если он еще не существует, он вызывает getInstance()

деЫпзЬапсе Получить новый объект Session.

Итак, создается новый объект сеанса, независимо от того, существует ли он уже.

Ответ 2

Причина Эта ошибка возникает в методе getDefaultInstance в javax.mail.Session.java. Согласно этому исходному коду эта ошибка возникает, когда объект сеанса по умолчанию уже инициализирован, но экземпляр аутентификатора обновляется или изменяется, или загрузчик классов объекта сеанса по умолчанию отличается от аутентификатора аргумента. Возможно, исходный код java, использующий экземпляр сеанса java по умолчанию, перекомпилируется и перезагружается, или дубликаты библиотек классов javamail включены в классpath среды.  он дает правильное решение

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;
   }

Ответ 3

Для меня было очень важно использовать getInstance() вместо getDefaultInstance().

Поскольку после изменения свойств сеанса почты почтовый сеанс по-прежнему сохранял старые свойства.

So getDefaultInstance() - это похоже на Singleton.

Как сказано в документах:

Обратите внимание, что объект Properties используется только при первом вызове этого метода при создании нового объекта Session. Последующие вызовы возвращают объект Session, который был создан первым вызовом, и игнорируют переданный объект Properties. Используйте метод getInstance для получения нового объекта Session каждый раз при вызове метода.

Ответ 4

Часто задаваемые вопросы: https://javaee.github.io/javamail/FAQ#getdefaultinstance

Q: Когда следует использовать Session.getDefaultInstance, и когда мне нужно использовать Session.getInstance?

A: Почти весь код должен использовать Session.getInstance. Session.getDefaultInstance метод создает новый сеанс первый время, которое он вызывал, используя переданные свойства. последующее вызовы возвращают этот оригинальный сеанс и игнорируют любые свойства, которые вы введите. Если вы хотите создать разные сеансы с разными свойства, Session.getDefaultInstance этого не сделает. Если какой-то другой код в той же JVM (например, на том же сервере приложений) уже создали сеанс по умолчанию со своими свойствами, вы можете в конечном итоге используя их сеанс, и ваши свойства будут проигнорированы. Это часто объясняет, почему ваши настройки свойств, похоже, игнорируются. Всегда использовать Session.getInstance, чтобы избежать этой проблемы.