2014-12-01 5 views
43

У меня есть приложение для загрузки весны. Я добавил много зависимостей (к сожалению, мне все это нужно), и время запуска увеличилось довольно много. Просто делать SpringApplication.run(source, args) занимает 10 секунд.Ускорение загрузки Весеннее время загрузки

Хотя это может быть не так много по сравнению с тем, что используется, я недоволен тем, что это занимает много, главным образом потому, что он нарушает поток развития. На данный момент само приложение довольно мало, поэтому я предполагаю, что большая часть времени связана с добавленными зависимостями, а не с самими классами приложений.

Я предполагаю, что речь идет путь к классам сканирования, но я не уверен, как:

  • Убедитесь, что это проблема (т.е. как «отладки» Spring загрузки)
  • Если это действительно является причиной , как я могу его ограничить, поэтому он становится быстрее? Например, если я знаю, что некоторые зависимости или пакет не содержат ничего, что должна сканировать Spring, существует ли способ ограничить это?

Я предполагаю, что это:

бы ускорить вещи, но это даже не отбирали раненых в этой точке. Я вижу некоторые другие усилия в самой весны Ботинок и т.д .:

, но это выглядит Tomcat-специфичны.

В этой статье:

хотя направлены на интеграцию тестов, предлагает использовать lazy-init=true, однако я не знаю, как применить это все бобы в Спринг загрузки с помощью конфигурации Java - любой указатели здесь?

Любые предложения будут приветствоваться.

+0

сообщения кода. Обычно сканируется только пакет, на котором определен бегун приложения. Если у вас есть другие пакеты, определенные для '@ ComponentScan', они также сканируются. Другое дело - убедиться, что вы не включили отладочную запись или трассировку протоколов, поскольку в целом регистрация выполняется медленно, очень медленно. –

+0

Если вы используете Hibernate, он также имеет тенденцию есть значительное время при запуске приложения. –

+0

Автоматическое связывание пружины по типу в сочетании с заводскими фасолью может быть медленным, когда вы добавляете много бобов и зависимостей. –

ответ

-2

Для меня это похоже на неправильную настройку конфигурации. Начните с проверки myContainer и возможных конфликтов. Чтобы определить, кто использует большинство ресурсов, вы должны проверять карты памяти (см. Количество данных!) Для каждой зависимости за раз - и это занимает много времени ... (и привилегии SUDO). Кстати: вы обычно проверяете код на зависимости?

-1

Существует только один гарантированный способ разработки того, что здесь происходит, а именно для профилирования вашего приложения и поиска горячих точек, которые вызывают проблему.

Я рекомендую использовать YourKit. У этого есть очень хорошая интеграция IDE, таким образом Вы можете профилировать свое приложение из Eclipse или что угодно.Смотрите здесь

https://www.yourkit.com/docs/java/help/local_profiling.jsp

Вы очень быстро сможете увидеть, что является причиной проблемы, то можете оставить назад здесь для возможных решений.

0

Вы можете попробовать мою библиотеку FastClasspathScanner. Я не знаю, можете ли вы заставить Spring работать с ним, но он сканирует путь класса намного быстрее, чем Spring.

25

Spring Boot делает много автоматической конфигурации, которая может не понадобиться. Таким образом, вы можете ограничить только автоматическую настройку, необходимую для вашего приложения. Чтобы просмотреть полный список автоконфигурации, просто запустите регистрацию org.springframework.boot.autoconfigure в режиме DEBUG (logging.level.org.springframework.boot.autoconfigure=DEBUG в application.properties). Другим вариантом является запуск приложения загрузки пружинный с --debug вариант: java -jar myproject-0.0.1-SNAPSHOT.jar --debug

Там будет что-то вроде этого на выходе:

========================= 
AUTO-CONFIGURATION REPORT 
========================= 

Проверьте этот список и включать в себя только autoconfigurations вам нужно:

@Configuration 
@Import({ 
     DispatcherServletAutoConfiguration.class, 
     EmbeddedServletContainerAutoConfiguration.class, 
     ErrorMvcAutoConfiguration.class, 
     HttpEncodingAutoConfiguration.class, 
     HttpMessageConvertersAutoConfiguration.class, 
     JacksonAutoConfiguration.class, 
     ServerPropertiesAutoConfiguration.class, 
     PropertyPlaceholderAutoConfiguration.class, 
     ThymeleafAutoConfiguration.class, 
     WebMvcAutoConfiguration.class, 
     WebSocketAutoConfiguration.class, 
}) 
public class SampleWebUiApplication { 

Код был скопирован с this blog post.

+0

Как запустить org.springframework в режиме DEBUG? –

+0

Вы измерили это ??? Было ли это намного быстрее? На мой взгляд, это исключительный случай, гораздо важнее убедиться, что кеш контекста Spring test работает – idmitriev

5

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

См: Minimise Spring Boot Startup Time

В итоге:

Вы можете видеть, что происходит под одеялом и включить ведение журнала отладки так просто, как с указанием --debug при запуске приложения из командной строки. Вы также можете указать debug = true в вашем приложении application.properties.

Кроме того, вы можете установить уровень протоколирования в application.properties просто:

logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ОШИБКА

If вы обнаруживаете автоматически сконфигурированный модуль, который вам не нужен, его можно отключить. Документы для этого можно найти здесь: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration

Пример может выглядеть следующим образом:

@Configuration 
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 
public class MyConfiguration { 
} 
Смежные вопросы