Skip to content

Commit a7e87cc

Browse files
committed
1 parent c0dddf7 commit a7e87cc

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@
5757
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
5858
public class DataSourceAutoConfiguration {
5959

60+
/**
61+
* The name of the bean that initializes the datasource using data.sql and schema.sql.
62+
*/
63+
public static final String DATASOURCE_INITIALIZER_INVOKER_BEAN_NAME = "dataSourceInitializerInvoker";
64+
6065
@Configuration(proxyBeanMethods = false)
6166
@Conditional(EmbeddedDatabaseCondition.class)
6267
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.springframework.beans.factory.support.AbstractBeanDefinition;
2121
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
2222
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
23+
import org.springframework.context.ApplicationContext;
24+
import org.springframework.context.annotation.Bean;
2325
import org.springframework.context.annotation.Configuration;
2426
import org.springframework.context.annotation.Import;
2527
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
@@ -31,9 +33,15 @@
3133
* @author Stephane Nicoll
3234
*/
3335
@Configuration(proxyBeanMethods = false)
34-
@Import({ DataSourceInitializerInvoker.class, DataSourceInitializationConfiguration.Registrar.class })
36+
@Import(DataSourceInitializationConfiguration.Registrar.class)
3537
class DataSourceInitializationConfiguration {
3638

39+
@Bean(name = DataSourceAutoConfiguration.DATASOURCE_INITIALIZER_INVOKER_BEAN_NAME)
40+
DataSourceInitializerInvoker dataSourceInitializerInvoker(ApplicationContext applicationContext,
41+
DataSourceProperties properties) {
42+
return new DataSourceInitializerInvoker(applicationContext, properties);
43+
}
44+
3745
/**
3846
* {@link ImportBeanDefinitionRegistrar} to register the
3947
* {@link DataSourceInitializerPostProcessor} without causing early bean instantiation

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializerInvoker.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,7 +22,6 @@
2222
import org.apache.commons.logging.LogFactory;
2323

2424
import org.springframework.beans.factory.InitializingBean;
25-
import org.springframework.beans.factory.ObjectProvider;
2625
import org.springframework.context.ApplicationContext;
2726
import org.springframework.context.ApplicationListener;
2827
import org.springframework.core.log.LogMessage;
@@ -39,21 +38,17 @@ class DataSourceInitializerInvoker implements ApplicationListener<DataSourceSche
3938

4039
private static final Log logger = LogFactory.getLog(DataSourceInitializerInvoker.class);
4140

42-
private final ObjectProvider<DataSource> dataSource;
41+
private final ApplicationContext applicationContext;
4342

4443
private final DataSourceProperties properties;
4544

46-
private final ApplicationContext applicationContext;
47-
4845
private DataSourceInitializer dataSourceInitializer;
4946

5047
private boolean initialized;
5148

52-
DataSourceInitializerInvoker(ObjectProvider<DataSource> dataSource, DataSourceProperties properties,
53-
ApplicationContext applicationContext) {
54-
this.dataSource = dataSource;
55-
this.properties = properties;
49+
DataSourceInitializerInvoker(ApplicationContext applicationContext, DataSourceProperties properties) {
5650
this.applicationContext = applicationContext;
51+
this.properties = properties;
5752
}
5853

5954
@Override
@@ -95,7 +90,7 @@ public void onApplicationEvent(DataSourceSchemaCreatedEvent event) {
9590

9691
private DataSourceInitializer getDataSourceInitializer() {
9792
if (this.dataSourceInitializer == null) {
98-
DataSource ds = this.dataSource.getIfUnique();
93+
DataSource ds = this.applicationContext.getBeanProvider(DataSource.class).getIfUnique();
9994
if (ds != null) {
10095
this.dataSourceInitializer = new DataSourceInitializer(ds, this.properties, this.applicationContext);
10196
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,16 +17,20 @@
1717
package org.springframework.boot.autoconfigure.orm.jpa;
1818

1919
import javax.persistence.EntityManager;
20+
import javax.persistence.EntityManagerFactory;
2021

2122
import org.hibernate.engine.spi.SessionImplementor;
2223

2324
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2425
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2527
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
28+
import org.springframework.boot.autoconfigure.data.jpa.EntityManagerFactoryDependsOnPostProcessor;
2629
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
2730
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2831
import org.springframework.context.annotation.Configuration;
2932
import org.springframework.context.annotation.Import;
33+
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
3034
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
3135

3236
/**
@@ -45,4 +49,19 @@
4549
@Import(HibernateJpaConfiguration.class)
4650
public class HibernateJpaAutoConfiguration {
4751

52+
/**
53+
* Post processor to ensure that the event listener that handles schema initialization
54+
* is fully initialized before any {@link EntityManagerFactory} beans.
55+
*/
56+
@ConditionalOnBean(value = AbstractEntityManagerFactoryBean.class,
57+
name = DataSourceAutoConfiguration.DATASOURCE_INITIALIZER_INVOKER_BEAN_NAME)
58+
static class DataSourceInitializerEntityManagerFactoryDependsOnPostProcessor
59+
extends EntityManagerFactoryDependsOnPostProcessor {
60+
61+
DataSourceInitializerEntityManagerFactoryDependsOnPostProcessor() {
62+
super(DataSourceAutoConfiguration.DATASOURCE_INITIALIZER_INVOKER_BEAN_NAME);
63+
}
64+
65+
}
66+
4867
}

0 commit comments

Comments
 (0)