Java @EnableWebMvc上的Spring条件bean

Java @EnableWebMvc上的Spring条件bean,java,spring,spring-boot,Java,Spring,Spring Boot,如何根据项目中是否没有另一个不同的bean(用@EnableWebMvc注释)来控制bean的创建 我试过了 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 正如建议的那样,但运气不好。当@EnableWebMvc存在时,我得到了这种矛盾的状态 WebMVCAUTO配置: 不匹配: -@ConditionalOnMissingBean(类型:org.springframework.web.servlet.config.an

如何根据项目中是否没有另一个不同的bean(用
@EnableWebMvc
注释)来控制bean的创建

我试过了

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
正如建议的那样,但运气不好。当@EnableWebMvc存在时,我得到了这种矛盾的状态

WebMVCAUTO配置: 不匹配: -@ConditionalOnMissingBean(类型:org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;SearchStrategy:all)找到类型为“org.springframework.web.servlet.config.annotation.org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration”的bean(OnBeanCondition)

而且

问题模块注册器匹配: -@ConditionalOnMissingBean(类型:org.springframework.web.servlet.config.annotation.webmvcConfiguration支持;SearchStrategy:all)未找到任何bean(OnBeanCondition)

因此,它找到了类型为
WebMvcConfigurationSupport

作为另一种尝试,我还比较了注册bean是否使用
@EnableWebMvc
,并注意到没有它,有一个bean名为
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
。所以我尝试了一个
@ConditionalOnMissingBean(WebMvcAutoConfiguration.class)
,但仍然不起作用。它显示了这种矛盾的状态

WebMvcAutoConfiguration匹配的: -@conditionalclass找到了必需的类“javax.servlet.servlet”、“org.springframework.web.servlet.DispatcherServlet”、“org.springframework.web.servlet.config.annotation.webmvcconfiguer”(OnClassCondition) -找到“会话”作用域(OnWebApplicationCondition) -@ConditionalOnMissingBean(类型:org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;SearchStrategy:all)未找到任何bean(OnBeanCondition)

而且

问题模块注册器匹配: -@ConditionalOnMissingBean(类型:org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;SearchStrategy:all)未找到任何bean(OnBeanCondition)


因此,
WebMvcAutoConfiguration
匹配(已创建)并且缺少
WebMvcAutoConfiguration
的依赖项也匹配了
将执行您的代码,而您想要的是相反的-不执行。也许您应该尝试混合使用您发布的链接中示例中提供的
@ConditionalOnClass
@AutoConfigureAfter


我在一些与数据库相关的bean中使用了
Conditional
s和
AutoconfigureAfter
的操作,实际上就是这样。只需要更好地了解您的应用程序,就可以提供更具体的建议

@ConditionalOnMissingBean
将执行您的代码,而您想要的是相反的-而不是执行。也许您应该尝试混合使用您发布的链接中示例中提供的
@ConditionalOnClass
@AutoConfigureAfter


我在一些与数据库相关的bean中使用了
Conditional
s和
AutoconfigureAfter
的操作,实际上就是这样。只需更好地了解您的应用程序,就可以提供更具体的建议

您需要确保在创建后创建带注释的bean

从春天开始

当前bean所依赖的bean。指定的任何bean都是 保证在这个bean之前由容器创建

除了如上所述的
@ConditionalOnMissingBean
之外,还使用
@DependsOn
注释

并且还要确保您是在
@configuration
注释类中执行这些操作的

@Configuration
public class Config {

    @Bean
    @DependsOn({"webMvcConfigurationSupport"})
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
     public FileProcessor fileProcessor(){
        return new FileProcessor();
    }

在本例中,仅当webMvcConfigurationSupport bean丢失时才会创建fileProcessor。

您需要确保
@conditionalMissingBean
注释bean的创建将在创建后进行

从春天开始

当前bean所依赖的bean。指定的任何bean都是 保证在这个bean之前由容器创建

除了如上所述的
@ConditionalOnMissingBean
之外,还使用
@DependsOn
注释

并且还要确保您是在
@configuration
注释类中执行这些操作的

@Configuration
public class Config {

    @Bean
    @DependsOn({"webMvcConfigurationSupport"})
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
     public FileProcessor fileProcessor(){
        return new FileProcessor();
    }

在本例中,仅当webMvcConfigurationSupport bean丢失时才会创建fileProcessor。

问题是您只能在自动配置上下文中使用
@conditionalMissingBean
。javadoc说

该条件只能与应用程序上下文迄今为止处理过的bean定义相匹配,因此,强烈建议仅在自动配置类上使用该条件

我试图在常规应用程序中使用注释。有关创建自动配置模块的更多信息,请查看。一旦我这样做了(特别是,将类添加到
spring.factories
),它就可以使用

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

问题是您只能在自动配置上下文中使用
@ConditionalOnMissingBean
。javadoc说

该条件只能与应用程序上下文迄今为止处理过的bean定义相匹配,因此,强烈建议仅在自动配置类上使用该条件

我试图在常规应用程序中使用注释。有关创建自动配置模块的更多信息,请查看。一旦我这样做了(具体来说,添加