diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/init/DruidDataSourceInitializer.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/init/DruidDataSourceInitializer.java index 7d29138..5c956fd 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/init/DruidDataSourceInitializer.java +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/init/DruidDataSourceInitializer.java @@ -1,14 +1,11 @@ package com.github.trang.druid.autoconfigure.datasource.init; import com.github.trang.druid.autoconfigure.DruidDataSourceInitializerAutoConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; -import org.springframework.boot.autoconfigure.jdbc.DataSourceInitializedEvent; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.config.ResourceNotFoundException; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationListener; import org.springframework.core.io.Resource; import org.springframework.jdbc.config.SortedResourcesFactoryBean; import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; @@ -20,34 +17,29 @@ import javax.sql.DataSource; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; /** - * Bean to handle {@link DataSource} initialization by running {@literal schema-*.sql} on - * {@link PostConstruct} and {@literal data-*.sql} SQL scripts on a - * {@link DataSourceInitializedEvent}. + * Bean to handle {@link DataSource} initialization by running {@literal schema-*.sql} on {@link PostConstruct}. * * @author Dave Syer * @author Phillip Webb * @author EddĂș MelĂ©ndez * @author Stephane Nicoll * @author Kazuki Shimizu - * @since 1.1.0 * @see DruidDataSourceInitializerAutoConfiguration + * @since 1.1.0 */ -public class DruidDataSourceInitializer implements ApplicationListener { - - private static final Logger logger = LoggerFactory.getLogger(DruidDataSourceInitializer.class); +@Slf4j +public class DruidDataSourceInitializer { private final DataSourceProperties properties; private final ApplicationContext applicationContext; - private DataSource dataSource; + private List dataSources = new ArrayList<>(); - private boolean initialized = false; - - public DruidDataSourceInitializer(DataSourceProperties properties, - ApplicationContext applicationContext) { + public DruidDataSourceInitializer(DataSourceProperties properties, ApplicationContext applicationContext) { this.properties = properties; this.applicationContext = applicationContext; } @@ -55,79 +47,74 @@ public class DruidDataSourceInitializer implements ApplicationListener 0) { - this.dataSource = this.applicationContext.getBean(DataSource.class); + if (this.applicationContext.getBeanNamesForType(DataSource.class, false, false).length > 0) { + Map beans = this.applicationContext.getBeansOfType(DataSource.class, false, false); + dataSources.addAll(beans.values()); } - if (this.dataSource == null) { - logger.debug("No DataSource found so not initializing"); + if (this.dataSources == null || this.dataSources.isEmpty()) { + log.debug("No DataSource found so not initializing"); return; } - runSchemaScripts(); + for (DataSource dataSource : dataSources) { + runSchemaScripts(dataSource); + } } - private void runSchemaScripts() { - List scripts = getScripts("spring.datasource.schema", - this.properties.getSchema(), "schema"); + private void runSchemaScripts(DataSource dataSource) { + List scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema"); if (!scripts.isEmpty()) { String username = this.properties.getSchemaUsername(); String password = this.properties.getSchemaPassword(); - runScripts(scripts, username, password); - try { - this.applicationContext - .publishEvent(new DataSourceInitializedEvent(this.dataSource)); - // The listener might not be registered yet, so don't rely on it. - if (!this.initialized) { - runDataScripts(); - this.initialized = true; - } - } catch (IllegalStateException ex) { - logger.warn("Could not send event to complete DataSource initialization (" - + ex.getMessage() + ")"); - } + runScripts(dataSource, scripts, username, password); + runDataScripts(dataSource); } } - @Override - public void onApplicationEvent(DataSourceInitializedEvent event) { - if (!this.properties.isInitialize()) { - logger.debug("Initialization disabled (not running data scripts)"); - return; - } - // NOTE the event can happen more than once and - // the event datasource is not used here - if (!this.initialized) { - runDataScripts(); - this.initialized = true; + private void runDataScripts(DataSource dataSource) { + List scripts = getScripts("spring.datasource.data", this.properties.getData(), "data"); + if (!scripts.isEmpty()) { + String username = this.properties.getDataUsername(); + String password = this.properties.getDataPassword(); + runScripts(dataSource, scripts, username, password); } } - private void runDataScripts() { - List scripts = getScripts("spring.datasource.data", - this.properties.getData(), "data"); - String username = this.properties.getDataUsername(); - String password = this.properties.getDataPassword(); - runScripts(scripts, username, password); + private void runScripts(DataSource dataSource, List resources, String username, String password) { + ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); + populator.setContinueOnError(this.properties.isContinueOnError()); + populator.setSeparator(this.properties.getSeparator()); + if (this.properties.getSqlScriptEncoding() != null) { + populator.setSqlScriptEncoding(this.properties.getSqlScriptEncoding().name()); + } + for (Resource resource : resources) { + populator.addScript(resource); + } + if (StringUtils.hasText(username) && StringUtils.hasText(password)) { + dataSource = DataSourceBuilder.create(this.properties.getClassLoader()) + .driverClassName(this.properties.determineDriverClassName()) + .url(this.properties.determineUrl()) + .username(username) + .password(password).build(); + } + DatabasePopulatorUtils.execute(populator, dataSource); } - private List getScripts(String propertyName, List resources, - String fallback) { + private List getScripts(String propertyName, List resources, String fallback) { if (resources != null) { return getResources(propertyName, resources, true); } String platform = this.properties.getPlatform(); - List fallbackResources = new ArrayList(); + List fallbackResources = new ArrayList<>(); fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); fallbackResources.add("classpath*:" + fallback + ".sql"); return getResources(propertyName, fallbackResources, false); } - private List getResources(String propertyName, List locations, - boolean validate) { - List resources = new ArrayList(); + private List getResources(String propertyName, List locations, boolean validate) { + List resources = new ArrayList<>(); for (String location : locations) { for (Resource resource : doGetResources(location)) { if (resource.exists()) { @@ -142,37 +129,12 @@ public class DruidDataSourceInitializer implements ApplicationListener resources, String username, String password) { - if (resources.isEmpty()) { - return; - } - ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); - populator.setContinueOnError(this.properties.isContinueOnError()); - populator.setSeparator(this.properties.getSeparator()); - if (this.properties.getSqlScriptEncoding() != null) { - populator.setSqlScriptEncoding(this.properties.getSqlScriptEncoding().name()); - } - for (Resource resource : resources) { - populator.addScript(resource); - } - DataSource dataSource = this.dataSource; - if (StringUtils.hasText(username) && StringUtils.hasText(password)) { - dataSource = DataSourceBuilder.create(this.properties.getClassLoader()) - .driverClassName(this.properties.determineDriverClassName()) - .url(this.properties.determineUrl()).username(username) - .password(password).build(); - } - DatabasePopulatorUtils.execute(populator, dataSource); - } - } \ No newline at end of file