В чем разница между getDefaultInstance () и getInstance () в классе Session? - PullRequest
16 голосов
/ 15 ноября 2010

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

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

Надеюсь, что эксперты помогут мне лучше понять это.

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

Ответы [ 4 ]

18 голосов
/ 16 ноября 2010

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

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

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

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

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

2 голосов
/ 20 октября 2017

FAQ говорит: https://javaee.github.io/javamail/FAQ#getdefaultinstance

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

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

2 голосов
/ 06 ноября 2015

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

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

Итак getDefaultInstance() - это похоже на синглтон.

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

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

2 голосов
/ 10 июля 2013

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

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