如何防止 Spring boot war 文件在单独的上下文中加载组件两次?
How prevent Spring boot war file load component twice in separated context?
我有一个 spring 引导应用程序,打包为 war 文件并部署在 tomcat 服务器上。我注意到某些组件在启动时加载了两次:
- 应用程序启动时
- 当 ServletInitializer 启动时。
这给我带来了一些问题,因为我的组件之一是 EnableAsync,应该经常执行一些计划任务。当它在两个分离的上下文中加载两次时,每个任务都会完成两次并在数据库中生成重复的行。
有没有办法强制某些组件在 Spring 启动时仅在单个上下文中加载?例如,这意味着防止在 ServletInitializer 中初始化 bean。
那是我的 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);
}
}
感谢 M. Deinum 我发现我的代码中有一个额外的 SpringBootServletInitializer!我删除了它,现在一切正常了!
我有一个 spring 引导应用程序,打包为 war 文件并部署在 tomcat 服务器上。我注意到某些组件在启动时加载了两次:
- 应用程序启动时
- 当 ServletInitializer 启动时。
这给我带来了一些问题,因为我的组件之一是 EnableAsync,应该经常执行一些计划任务。当它在两个分离的上下文中加载两次时,每个任务都会完成两次并在数据库中生成重复的行。
有没有办法强制某些组件在 Spring 启动时仅在单个上下文中加载?例如,这意味着防止在 ServletInitializer 中初始化 bean。
那是我的 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);
}
}
感谢 M. Deinum 我发现我的代码中有一个额外的 SpringBootServletInitializer!我删除了它,现在一切正常了!