禁用BeanDefinitionOverriding Spring Boot Wep应用程序(war文件)

时间:2018-10-04 08:02:55

标签: java spring-boot web

如果我有重复的bean名称,Spring Boot将覆盖它。我想禁用此功能。我看到了很多关于此问题的讨论,其中它禁用了main方法中的覆盖。但在网络应用中,根本不会调用main方法。如何禁用它?

1 个答案:

答案 0 :(得分:0)

在您的main方法中,您需要创建一个新的ApplicationContextInitializer并覆盖其initialize()方法来禁用Bean定义覆盖。见下文:

new SpringApplicationBuilder(SpringBootApp.class)
    .initializers(new ApplicationContextInitializer<GenericApplicationContext>()
        {
            @Override
            public void initialize(GenericApplicationContext applicationContext)
            {
                applicationContext.setAllowBeanDefinitionOverriding(false);
            }
        })
    .run(args);

-更新-

由于您是作为Web应用程序部署的,因此上述方法当然行不通。

您可以实现WebApplicationInitializer接口并覆盖其startup()方法,提供自定义ApplicationContextInitializer

public class CustomInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) 
    {
        applicationContext.setAllowBeanDefinitionOverriding(false);
    }
}

public class WebInitializer implements WebApplicationInitializer 
{

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException
    {
        DispatcherServlet servlet = new DispatcherServlet();
        servlet.setContextInitializers(new CustomInitializer());
    }
}