猿问

@EnableWebMvc 上的 Spring 条件 bean

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

我试过

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

正如这里所建议的,但没有运气。当@EnableWebMvc 存在时,我得到了这种矛盾的状态

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

并且

ProblemModulesRegisterer 匹配:- @ConditionalOnMissingBean(类型:org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;SearchStrategy:全部)没有找到任何 beans (OnBeanCondition)

所以它找到并没有找到类型的beanWebMvcConfigurationSupport

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

WebMvcAutoConfiguration匹配:- @ConditionalOnClass 找到所需的类 'javax.servlet.Servlet'、'org.springframework.web.servlet.DispatcherServlet'、'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) - 找到'会话'范围(OnWebApplicationCondition)-@ConditionalOnMissingBean(类型:org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;SearchStrategy:all)没有找到任何bean(OnBeanCondition)

并且

ProblemModulesRegisterer 匹配:- @ConditionalOnMissingBean(类型:org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;SearchStrategy:全部)没有找到任何 beans (OnBeanCondition)

如此WebMvcAutoConfiguration匹配(已创建)并且 missing 的依赖项WebMvcAutoConfiguration也匹配


慕斯709654
浏览 119回答 3
3回答

FFIVE

@ConditionalOnMissingBean将执行您的代码,而您想要的是相反的-不执行。也许您应该尝试混合使用@ConditionalOnClass并@AutoConfigureAfter在您发布的链接中的示例中提供。我已经在一些与数据库相关的 bean 和Conditionals 的操作中使用过,并且AutoconfigureAfter确实做到了这一点。只需要更好地了解您的应用程序,以便能够提供更具体的建议

慕村225694

问题是您只能@ConditionalOnMissingBean在自动配置上下文中使用。javadoc 说该条件只能匹配到目前为止已被应用程序上下文处理的 bean 定义,因此,强烈建议仅在自动配置类上使用该条件我试图在常规应用程序中使用注释。一旦我这样做了(具体来说,将类添加到),它就可以通过使用来spring.factories检测@EnableWebMvc@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

浮云间

您需要确保@ConditionalOnMissingBean带注释的 bean 创建将在创建后 WebMvcConfigurationSupport发生。来自 spring文档,当前 bean 所依赖的 beans。指定的任何 bean 都保证在该 bean 之前由容器创建。除了此处解释的之外,还使用@DependsOn注释。 @ConditionalOnMissingBean并确保您在@configuration带注释的类中执行这些操作。@Configurationpublic class Config {    @Bean    @DependsOn({"webMvcConfigurationSupport"})    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)     public FileProcessor fileProcessor(){        return new FileProcessor();    }在此示例中,仅当缺少 webMvcConfigurationSupport bean 时才会创建 fileProcessor。
随时随地看视频慕课网APP

相关分类

Java
我要回答