Stop accessing the datasource if initialization mode is set to never
Closes gh-28931
This commit is contained in:
@@ -34,9 +34,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.jdbc.datasource.init.DatabasePopulator;
|
||||
@@ -103,6 +105,7 @@ public class BatchAutoConfiguration {
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnBean(DataSource.class)
|
||||
@ConditionalOnClass(DatabasePopulator.class)
|
||||
@Conditional(OnBatchDatasourceInitializationCondition.class)
|
||||
static class DataSourceInitializerConfiguration {
|
||||
|
||||
@Bean
|
||||
@@ -116,4 +119,12 @@ public class BatchAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
static class OnBatchDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
|
||||
|
||||
OnBatchDatasourceInitializationCondition() {
|
||||
super("Batch", "spring.batch.jdbc.initialize-schema", "spring.batch.initialize-schema");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ import org.springframework.boot.autoconfigure.condition.SearchStrategy;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
|
||||
import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.context.properties.PropertyMapper;
|
||||
@@ -233,6 +234,7 @@ public class IntegrationAutoConfiguration {
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(JdbcMessageStore.class)
|
||||
@ConditionalOnSingleCandidate(DataSource.class)
|
||||
@Conditional(OnIntegrationDatasourceInitializationCondition.class)
|
||||
protected static class IntegrationJdbcConfiguration {
|
||||
|
||||
@Bean
|
||||
@@ -342,4 +344,12 @@ public class IntegrationAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
static class OnIntegrationDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
|
||||
|
||||
OnIntegrationDatasourceInitializationCondition() {
|
||||
super("Integration", "spring.integration.jdbc.initialize-schema");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,10 +37,12 @@ import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.core.annotation.Order;
|
||||
@@ -134,6 +136,7 @@ public class QuartzAutoConfiguration {
|
||||
@SuppressWarnings("deprecation")
|
||||
@ConditionalOnMissingBean({ QuartzDataSourceScriptDatabaseInitializer.class,
|
||||
QuartzDataSourceInitializer.class })
|
||||
@Conditional(OnQuartzDatasourceInitializationCondition.class)
|
||||
public QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseInitializer(
|
||||
DataSource dataSource, @QuartzDataSource ObjectProvider<DataSource> quartzDataSource,
|
||||
QuartzProperties properties) {
|
||||
@@ -141,6 +144,14 @@ public class QuartzAutoConfiguration {
|
||||
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties);
|
||||
}
|
||||
|
||||
static class OnQuartzDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
|
||||
|
||||
OnQuartzDatasourceInitializationCondition() {
|
||||
super("Quartz", "spring.quartz.jdbc.initialize-schema");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
|
||||
@@ -58,6 +59,7 @@ class JdbcSessionConfiguration {
|
||||
@SuppressWarnings("deprecation")
|
||||
@ConditionalOnMissingBean({ JdbcSessionDataSourceScriptDatabaseInitializer.class,
|
||||
JdbcSessionDataSourceInitializer.class })
|
||||
@Conditional(OnJdbcSessionDatasourceInitializationCondition.class)
|
||||
JdbcSessionDataSourceScriptDatabaseInitializer jdbcSessionDataSourceScriptDatabaseInitializer(
|
||||
@SpringSessionDataSource ObjectProvider<DataSource> sessionDataSource,
|
||||
ObjectProvider<DataSource> dataSource, JdbcSessionProperties properties) {
|
||||
@@ -84,4 +86,12 @@ class JdbcSessionConfiguration {
|
||||
|
||||
}
|
||||
|
||||
static class OnJdbcSessionDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
|
||||
|
||||
OnJdbcSessionDatasourceInitializationCondition() {
|
||||
super("Jdbc Session", "spring.session.jdbc.initialize-schema");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.autoconfigure.sql.init;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
|
||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
|
||||
import org.springframework.boot.sql.init.DatabaseInitializationMode;
|
||||
import org.springframework.context.annotation.ConditionContext;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Condition that checks if the database initialization of a particular component should
|
||||
* be considered.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @since 2.6.2
|
||||
* @see DatabaseInitializationMode
|
||||
*/
|
||||
public class OnDatabaseInitializationCondition extends SpringBootCondition {
|
||||
|
||||
private final String name;
|
||||
|
||||
private final String[] propertyNames;
|
||||
|
||||
/**
|
||||
* Create a new instance with the name of the component and the property names to
|
||||
* check, in order. If a property is set, its value is used to determine the outcome
|
||||
* and remaining properties are not tested.
|
||||
* @param name the name of the component
|
||||
* @param propertyNames the properties to check (in order)
|
||||
*/
|
||||
public OnDatabaseInitializationCondition(String name, String... propertyNames) {
|
||||
this.name = name;
|
||||
this.propertyNames = propertyNames;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
|
||||
Environment environment = context.getEnvironment();
|
||||
String propertyName = getConfiguredProperty(environment);
|
||||
DatabaseInitializationMode mode = getDatabaseInitializationMode(environment, propertyName);
|
||||
boolean match = match(mode);
|
||||
String messagePrefix = (propertyName != null) ? propertyName : "default value";
|
||||
return new ConditionOutcome(match, ConditionMessage.forCondition(this.name + "Database Initialization")
|
||||
.because(messagePrefix + " is " + mode));
|
||||
}
|
||||
|
||||
private boolean match(DatabaseInitializationMode mode) {
|
||||
return !mode.equals(DatabaseInitializationMode.NEVER);
|
||||
}
|
||||
|
||||
private DatabaseInitializationMode getDatabaseInitializationMode(Environment environment, String propertyName) {
|
||||
if (StringUtils.hasText(propertyName)) {
|
||||
String candidate = environment.getProperty(propertyName, "embedded").toUpperCase(Locale.ENGLISH);
|
||||
if (StringUtils.hasText(candidate)) {
|
||||
return DatabaseInitializationMode.valueOf(candidate);
|
||||
}
|
||||
}
|
||||
return DatabaseInitializationMode.EMBEDDED;
|
||||
}
|
||||
|
||||
private String getConfiguredProperty(Environment environment) {
|
||||
for (String propertyName : this.propertyNames) {
|
||||
if (environment.containsProperty(propertyName)) {
|
||||
return propertyName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user