我认为SpringBoot项目需要很长时间才能加载。这可能是因为SpringBoot为您配置组件,其中一些组件您甚至不需要。
最明显的做法是从类路径中删除不必要的依赖项。然而,仅此还不够。
有没有方法可以找出SpringBoot正在为您配置哪些模块,以便挑选出您不需要的并禁用它们?
除了从类路径中删除不必要的依赖项外,还有其他方法可以加快SpringBoot应用程序的启动时间吗?
我认为SpringBoot项目需要很长时间才能加载。这可能是因为SpringBoot为您配置组件,其中一些组件您甚至不需要。
最明显的做法是从类路径中删除不必要的依赖项。然而,仅此还不够。
有没有方法可以找出SpringBoot正在为您配置哪些模块,以便挑选出您不需要的并禁用它们?
除了从类路径中删除不必要的依赖项外,还有其他方法可以加快SpringBoot应用程序的启动时间吗?
我可以告诉你,我运行了一个大型(800,000+行代码)的应用程序,使用Spring MVC、JMS、Atomikos事务、Hibernate、JMX支持和嵌入式Tomcat通过restful webservice。尽管如此,该应用程序在我的本地桌面上启动时间约为19秒。
Spring Boot努力避免配置您未使用的模块,但是很容易引入您没有打算使用的额外依赖项和配置。
请记住,Spring Boot遵循惯例优于配置范例,只需将库放置在类路径中即可导致Spring Boot尝试配置模块以使用该库。而且,只要简单地在您的类上添加@RestController注释,就会触发Spring Boot自动配置整个Spring MVC堆栈。
您可以指定--debug
来启动命令行中的应用程序,以查看内部发生了什么,并启用调试日志记录。您还可以在application.properties中指定debug=true。
此外,您可以像这样简单地设置application.properties中的日志级别:
logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
如果您检测到一个自动配置的模块,您不想要它,就可以禁用它。 关于此的文档可以在这里找到: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 {
}
以下是一些可能有帮助的额外提示:
hibernate.ddl-auto=none
设置为 update
代替 -Xquickstart
-XX:TieredStopAtLevel=1 -noverify
此外:
正如这篇文章所推荐的,在本地开发环境中使用 @ComponentScan(lazyInit = true)
。
简而言之:
我们想要实现的目标是仅在本地开发环境中启用 bean 懒加载,并将急切初始化保留给生产环境。他们说你不能两全其美,但是在 Spring 中,实际上可以。这都要归功于配置文件。
@SpringBootApplication
public class LazyApplication {
public static void main(String[] args) {
SpringApplication.run(LazyApplication.class, args);
}
@Configuration
@Profile("local")
@ComponentScan(lazyInit = true)
static class LocalConfig {
}
}
-noverify
在 JDK 13 中已被弃用,并且可能会在未来的版本中被移除。 - WirJun