首页 > 解决方案 > 如何防止Spring boot war文件在单独的上下文中加载组件两次?

问题描述

我有一个 spring boot 应用程序,打包为一个 war 文件并部署在 tomcat 服务器上。我注意到某些组件在启动时加载了两次:

  1. 应用程序启动时
  2. 当 ServletInitializer 启动时。

它给我带来了一些问题,因为我的组件之一是 EnableAsync 并且应该经常执行一些计划任务。当它在两个分离的上下文中加载两次时,每个任务都会完成两次并在数据库中创建重复的行。

有没有办法在 Spring Boot 中强制某些组件在单个上下文中加载?例如,这意味着防止 bean 在 ServletInitializer 中初始化。

那是我的 SpringBootServletInitializer 代码:

@SpringBootApplication
@EnableScheduling
@EnableAsync
public class TestApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @Bean
    public PasswordEncoder getPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(TestApplication.class);
    }
}

标签: springspring-boottomcatcomponentswar

解决方案


感谢M. Deinum,我发现我的代码中有一个额外的 SpringBootServletInitializer!我删除了它,现在一切正常!


推荐阅读