Почему Spring boot DefaultFormattingConversionService создается, но не упоминается? - PullRequest
4 голосов
/ 14 июля 2020
• 1000 не относить ни к какой ссылке. на что это влияет?

Я читал несколько раз исходный код, но все равно не понимал.

Кто мог мне помочь, заранее спасибо!

Обновление: Я отладил, но так и не нашел нигде сохранить ссылку косвенно. аватар

Ответы [ 2 ]

4 голосов
/ 27 июля 2020

TL; DR

Вы правы. Вызывается конструктор, и на сам объект никогда не ссылаются (напрямую). Вы можете искать столько, сколько хотите, вы не найдете никакого использования этих созданных объектов.

Почему вы это сделали?

Файл, на который вы ссылаетесь, был создан Филом Уэббом в 2015 году, без Javado c, но с подробным описанием в сообщении фиксации:

Повышение производительности с помощью BackgroundPreinitializer

Добавьте BackgroundPreinitializer для запуска ранней инициализации в фоновом потоке трудоемких задач. Перемещая определенные задачи инициализации в фоновый поток и вызывая их на раннем этапе, мы можем улучшить критический путь при запуске приложения. Например, класс Tomcat MBeanFactory при первой загрузке анализирует несколько файлов XML. Если мы запускаем загрузку в фоновом потоке, он завершается до того, как Tomcat действительно должен его использовать.

Первоначальный набор инициализаторов, включенных в эту фиксацию:

  • Tomcat MBeanFactory
  • javax.validation
  • Spring's AllEncompassingFormHttpMessageConverter

См. gh-4252

Указанная проблема gh- 4252 перечисляет некоторые измерения производительности и утверждает, что улучшение производительности этой многопоточной предварительной инициализации составляет примерно 13% .

Метод, который вы указали, создавая DefaultFormattingConversionService был введен в # 5182bc4f2 , также г-ном. webb и - согласно сообщению фиксации и упомянутой проблеме (gh-6177) - не имеет большого эффекта .

0 голосов
/ 27 июля 2020

Я думаю, что, как было сказано ранее, здесь единственный эффект - инициализировать stati c вещи (поля и классы).

пример, если вы посмотрите на код ConversionServiceInitializer: 3 stati c boolean инициализируются путем проверки наличия определенных классов c в классе

private static final boolean jsr354Present = ClassUtils.isPresent(
        "javax.money.MonetaryAmount", DefaultFormattingConversionService.class.getClassLoader());

private static final boolean jsr310Present = ClassUtils.isPresent(
        "java.time.LocalDate", DefaultFormattingConversionService.class.getClassLoader());

private static final boolean jodaTimePresent = ClassUtils.isPresent(
        "org.joda.time.LocalDate", DefaultFormattingConversionService.class.getClassLoader());

Конструктор по умолчанию для ConversionServiceInitializer также косвенно вызывает инициализацию всех преобразователей по умолчанию

publi c DefaultFormattingConversionService ()

-> this (null, true);

->

DefaultConversionService.addDefaultConverters(this);
if (registerDefaultFormatters) {
    addDefaultFormatters(this);
}

каждый из 2 вызовов

  • DefaultConversionService .addDefaultConverters (this)
  • и addDefaultFormatters (this)

инициализируют несколько форматеров и преобразователей по умолчанию. у большинства из них нет статической c инициализации, но у некоторых есть.

Инициализация экземпляра DefaultConversionService в начале приложения позволяет инициализировать все конвертеры при запуске, чтобы они не выполняли ленивую инициализацию в момент, когда пользователь ждет ответа ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...