如果应用程序在嵌入式容器中运行,我希望创建@Bean。如果应用程序在外部tomcat上运行,则不应创建该bean。有没有办法只有当应用程序在嵌入式tomcat中运行时才能创建@Conditional批注来创建bean。
答案 0 :(得分:3)
您可以使用仅在使用嵌入式容器时启用的Spring配置文件,而不是使用自定义条件。当您将Spring Boot应用程序部署到Tomcat时,它的主要方法不会运行,这使得它成为启用您只想在嵌入式案例中处于活动状态的配置文件的好地方。
这样的事情:
@SpringBootApplication
public class So34924050Application extends SpringBootServletInitializer {
@Bean
@Profile("embedded")
public EmbeddedOnlyBean embeddedOnlyBean() {
return new EmbeddedOnlyBean();
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(So34924050Application.class);
}
public static void main(String[] args) {
new SpringApplicationBuilder(So34924050Application.class).profiles("embedded").run(args);
}
}
答案 1 :(得分:1)
我使用了@ConditionalOnClass
注释,只有在存在嵌入式 Tomcat类时才创建TomcatFactory。如果这不适合您的目的,则可以使用多个@CondtionalOn...
类来有条件地创建bean。例如@CondtionalOnProperty
。
即
// If running tomcat embedded, ensure that JNDI is enabled.
@Bean
@ConditionalOnClass(name = {
"org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory",
"org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer",
"org.apache.catalina.startup.Tomcat"
})
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(final Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
答案 2 :(得分:0)
您可以使用与Spring Boot的AutoConfiguration类EmbeddedWebServerFactoryCustomizerAutoConfiguration
(此处为2.1.0版)相同的条件来自定义嵌入式tomcat的配置。
@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class })
public class TomcatEmbeddedConfig {
@Bean
ConfigurableServletWebServerFactory webServerFactory() {
return new TomcatServletWebServerFactory() {
// Configure embedded tomcat here
}
}
}