Java Spring组件注释编译时扫描

Java Spring组件注释编译时扫描,java,spring,spring-mvc,startup,Java,Spring,Spring Mvc,Startup,我的信念是,春天的引导 ContextLoaderListener 调度员服务 由于指示 <context:component-scan base-package=" ..... " /> 将在应用程序启动时(或根据指示在运行时)执行组件扫描 是否有方法指示编译器(可能通过maven构建插件)在构建/编译期间对带注释的spring组件执行一次性静态扫描,以便在不放弃使用组件注释的情况下不执行引导组件扫描 作为一种减少启动负载和延迟的方法。Spring5添加了一个选项。当找到

我的信念是,春天的引导

  • ContextLoaderListener
  • 调度员服务
由于指示

<context:component-scan base-package=" ..... " />

将在应用程序启动时(或根据指示在运行时)执行组件扫描

是否有方法指示编译器(可能通过maven构建插件)在构建/编译期间对带注释的spring组件执行一次性静态扫描,以便在不放弃使用组件注释的情况下不执行引导组件扫描


作为一种减少启动负载和延迟的方法。

Spring5添加了一个选项。当找到索引时,只使用索引并跳过完整的类路径扫描。

Spring 5添加了一项新功能以提高大型应用程序的启动性能

它在编译时创建组件候选列表

在此模式下,应用程序的所有模块都必须使用此机制,因为当ApplicationContext检测到此类索引时,它将自动使用它,而不是扫描类路径

要生成索引,我们只需要向每个模块添加以下依赖项

Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-indexer</artifactId>
        <version>5.0.3.RELEASE</version>
        <optional>true</optional>
    </dependency>
</dependencies>
dependencies {
    compileOnly("org.springframework:spring-context-indexer:5.0.3.RELEASE")
}
此过程将生成一个META-INF/spring.components文件,该文件将包含在jar中


参考资料:

那太酷了。我从未听说过这样的插件。然后,您必须在运行时禁用配置。首先,反转控制框架会增加启动延迟,但仅此而已。。。除非你的应用程序需要一段难以置信的长时间才能启动,否则你没有必要这么做。其次,我们不再使用XML配置和组件扫描,因为我们发现SpringJavaConfig更显式。。。作为一个额外的奖励,启动时间缩短了“不相关的重要”信息的丢失:我一直在努力将一个应用程序迁移到谷歌应用程序引擎。gae建议将尽可能多的活动转移到编译时。但我希望这是一个与gae无关的一般性问题。我也有同样的担忧。部署时间很重要:可能是部署/调试/重试所需的时间:在构建时生成context.xml肯定会缩短工作流时间。我认为,如果创建一个maven插件来过滤context.xml资源并扩展为单个bean声明并不困难(在Gradle 4.6+(包括Gradle 5.x,我已经在Gradle 5.1.1和5.2中进行了验证),那么正确的声明是annotationProcessor'org.springframework:spring context indexer:5.1.4.RELEASE'。