|
1 | 1 | /*
|
2 |
| - * Copyright 2012-2020 the original author or authors. |
| 2 | + * Copyright 2012-2021 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
16 | 16 |
|
17 | 17 | package org.springframework.boot.autoconfigure.jdbc;
|
18 | 18 |
|
19 |
| -import org.springframework.beans.factory.config.BeanDefinition; |
20 |
| -import org.springframework.beans.factory.support.AbstractBeanDefinition; |
21 |
| -import org.springframework.beans.factory.support.BeanDefinitionBuilder; |
22 |
| -import org.springframework.beans.factory.support.BeanDefinitionRegistry; |
| 19 | +import javax.persistence.EntityManagerFactory; |
| 20 | +import javax.sql.DataSource; |
| 21 | + |
| 22 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
| 23 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| 24 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; |
| 25 | +import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryDependsOnPostProcessor; |
| 26 | +import org.springframework.context.annotation.Bean; |
23 | 27 | import org.springframework.context.annotation.Configuration;
|
24 | 28 | import org.springframework.context.annotation.Import;
|
25 |
| -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; |
26 |
| -import org.springframework.core.type.AnnotationMetadata; |
| 29 | +import org.springframework.jdbc.core.JdbcOperations; |
| 30 | +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; |
| 31 | +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; |
27 | 32 |
|
28 | 33 | /**
|
29 |
| - * Configures DataSource initialization. |
| 34 | + * Configuration for {@link DataSource} initialization using DDL and DML scripts. |
30 | 35 | *
|
31 |
| - * @author Stephane Nicoll |
| 36 | + * @author Andy Wilkinson |
32 | 37 | */
|
33 | 38 | @Configuration(proxyBeanMethods = false)
|
34 |
| -@Import({ DataSourceInitializerInvoker.class, DataSourceInitializationConfiguration.Registrar.class }) |
| 39 | +@ConditionalOnSingleCandidate(DataSource.class) |
35 | 40 | class DataSourceInitializationConfiguration {
|
36 | 41 |
|
| 42 | + @Configuration(proxyBeanMethods = false) |
| 43 | + @ConditionalOnProperty(prefix = "spring.datasource", name = "initialization-order", havingValue = "before-jpa", |
| 44 | + matchIfMissing = true) |
| 45 | + @Import({ DataSourceInitializationJdbcOperationsDependsOnPostProcessor.class, |
| 46 | + DataSourceInitializationNamedParameterJdbcOperationsDependsOnPostProcessor.class, |
| 47 | + DataSourceInitializationEntityManagerFactoryDependsOnPostProcessor.class }) |
| 48 | + static class BeforeJpaDataSourceInitializationConfiguration { |
| 49 | + |
| 50 | + @Bean |
| 51 | + DataSourceInitialization dataSourceInitialization(DataSource dataSource, DataSourceProperties properties) { |
| 52 | + return new DataSourceInitialization(dataSource, properties); |
| 53 | + } |
| 54 | + |
| 55 | + } |
| 56 | + |
37 | 57 | /**
|
38 |
| - * {@link ImportBeanDefinitionRegistrar} to register the |
39 |
| - * {@link DataSourceInitializerPostProcessor} without causing early bean instantiation |
40 |
| - * issues. |
| 58 | + * Post processor to ensure that {@link EntityManagerFactory} beans depend on any |
| 59 | + * {@link DataSourceInitialization} beans. |
41 | 60 | */
|
42 |
| - static class Registrar implements ImportBeanDefinitionRegistrar { |
43 |
| - |
44 |
| - private static final String BEAN_NAME = "dataSourceInitializerPostProcessor"; |
45 |
| - |
46 |
| - @Override |
47 |
| - public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, |
48 |
| - BeanDefinitionRegistry registry) { |
49 |
| - if (!registry.containsBeanDefinition(BEAN_NAME)) { |
50 |
| - AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder |
51 |
| - .genericBeanDefinition(DataSourceInitializerPostProcessor.class, |
52 |
| - DataSourceInitializerPostProcessor::new) |
53 |
| - .getBeanDefinition(); |
54 |
| - beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); |
55 |
| - // We don't need this one to be post processed otherwise it can cause a |
56 |
| - // cascade of bean instantiation that we would rather avoid. |
57 |
| - beanDefinition.setSynthetic(true); |
58 |
| - registry.registerBeanDefinition(BEAN_NAME, beanDefinition); |
59 |
| - } |
| 61 | + @ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManagerFactory.class }) |
| 62 | + static class DataSourceInitializationEntityManagerFactoryDependsOnPostProcessor |
| 63 | + extends EntityManagerFactoryDependsOnPostProcessor { |
| 64 | + |
| 65 | + DataSourceInitializationEntityManagerFactoryDependsOnPostProcessor() { |
| 66 | + super(DataSourceInitialization.class); |
| 67 | + } |
| 68 | + |
| 69 | + } |
| 70 | + |
| 71 | + /** |
| 72 | + * Post processor to ensure that {@link JdbcOperations} beans depend on any |
| 73 | + * {@link DataSourceInitialization} beans. |
| 74 | + */ |
| 75 | + @ConditionalOnClass(JdbcOperations.class) |
| 76 | + static class DataSourceInitializationJdbcOperationsDependsOnPostProcessor |
| 77 | + extends JdbcOperationsDependsOnPostProcessor { |
| 78 | + |
| 79 | + DataSourceInitializationJdbcOperationsDependsOnPostProcessor() { |
| 80 | + super(DataSourceInitialization.class); |
| 81 | + } |
| 82 | + |
| 83 | + } |
| 84 | + |
| 85 | + /** |
| 86 | + * Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on |
| 87 | + * any {@link DataSourceInitialization} beans. |
| 88 | + */ |
| 89 | + @ConditionalOnClass(NamedParameterJdbcOperations.class) |
| 90 | + protected static class DataSourceInitializationNamedParameterJdbcOperationsDependsOnPostProcessor |
| 91 | + extends NamedParameterJdbcOperationsDependsOnPostProcessor { |
| 92 | + |
| 93 | + public DataSourceInitializationNamedParameterJdbcOperationsDependsOnPostProcessor() { |
| 94 | + super(DataSourceInitialization.class); |
60 | 95 | }
|
61 | 96 |
|
62 | 97 | }
|
|
0 commit comments