2020
2121import javax .sql .DataSource ;
2222
23+ import org .springframework .beans .BeansException ;
24+ import org .springframework .beans .factory .BeanFactory ;
25+ import org .springframework .beans .factory .BeanFactoryAware ;
2326import org .springframework .beans .factory .ObjectProvider ;
27+ import org .springframework .beans .factory .config .BeanDefinition ;
28+ import org .springframework .beans .factory .config .ConfigurableListableBeanFactory ;
29+ import org .springframework .beans .factory .support .AbstractBeanDefinition ;
30+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
31+ import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
2432import org .springframework .boot .autoconfigure .AutoConfiguration ;
2533import org .springframework .boot .autoconfigure .AutoConfigureOrder ;
2634import org .springframework .boot .autoconfigure .EnableAutoConfiguration ;
3139import org .springframework .boot .autoconfigure .sql .init .SqlInitializationAutoConfiguration ;
3240import org .springframework .context .annotation .Bean ;
3341import org .springframework .context .annotation .Conditional ;
42+ import org .springframework .context .annotation .Import ;
43+ import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
44+ import org .springframework .context .annotation .Primary ;
45+ import org .springframework .core .io .ClassPathResource ;
46+ import org .springframework .core .type .AnnotationMetadata ;
47+ import org .springframework .util .ClassUtils ;
3448
3549import grails .config .Config ;
3650import grails .core .GrailsApplication ;
3751import org .grails .datastore .gorm .jdbc .connections .DataSourceSettings ;
52+ import org .grails .datastore .mapping .config .Settings ;
53+ import org .grails .datastore .mapping .core .connections .ConnectionSource ;
3854import org .grails .datastore .mapping .core .connections .ConnectionSources ;
3955import org .grails .plugins .datasource .DataSourcePluginConfiguration .GrailsDataSourceCondition ;
4056
4864 DataSourceAutoConfiguration .class , SqlInitializationAutoConfiguration .class
4965})
5066@ AutoConfigureOrder (100 )
67+ @ Import (DataSourcePluginConfiguration .BeanPostProcessorsRegistrar .class )
5168@ Conditional (GrailsDataSourceCondition .class )
5269public class DataSourcePluginConfiguration {
5370
@@ -69,7 +86,9 @@ public ConnectionSources<DataSource, DataSourceSettings> dataSourceConnectionSou
6986 }
7087
7188 @ Bean
89+ @ Primary
7290 @ ConditionalOnMissingBean
91+ @ ConditionalOnProperty (prefix = "dataSource" , name = "url" )
7392 public DataSource dataSource (ConnectionSources <DataSource , DataSourceSettings > dataSourceConnectionSources ) {
7493 return dataSourceConnectionSources .getDefaultConnectionSource ().getSource ();
7594 }
@@ -86,16 +105,44 @@ static final class GrailsDataSourceCondition extends AnyNestedCondition {
86105 super (ConfigurationPhase .REGISTER_BEAN );
87106 }
88107
89- @ ConditionalOnProperty (prefix = "dataSource" , name = "url " )
108+ @ ConditionalOnProperty (name = "dataSource " )
90109 private static final class DataSourceUrlCondition {
91110
92111 }
93112
94- @ ConditionalOnProperty (prefix = "dataSources" , name = "default " )
113+ @ ConditionalOnProperty (name = "dataSources " )
95114 private static final class DataSourcesCondition {
96115
97116 }
98117
99118 }
100119
120+ public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar , BeanFactoryAware {
121+
122+ private ConfigurableListableBeanFactory beanFactory ;
123+
124+ @ Override
125+ public void setBeanFactory (BeanFactory beanFactory ) throws BeansException {
126+ if (beanFactory instanceof ConfigurableListableBeanFactory listableBeanFactory ) {
127+ this .beanFactory = listableBeanFactory ;
128+ }
129+ }
130+
131+ @ Override
132+ public void registerBeanDefinitions (AnnotationMetadata importingClassMetadata , BeanDefinitionRegistry registry ) {
133+ ConnectionSources <DataSource , DataSourceSettings > dataSourceConnectionSources = this .beanFactory .getBean ("dataSourceConnectionSources" , ConnectionSources .class );
134+ dataSourceConnectionSources .getAllConnectionSources ().forEach (dataSource -> {
135+ if (!dataSource .getName ().equals (ConnectionSource .DEFAULT )) {
136+ BeanDefinitionBuilder beanDefinitionBuilder =
137+ BeanDefinitionBuilder .genericBeanDefinition (DataSource .class , dataSource ::getSource )
138+ .setRole (BeanDefinition .ROLE_APPLICATION );
139+ AbstractBeanDefinition beanDefinition = beanDefinitionBuilder .getBeanDefinition ();
140+ String resourcePath = ClassUtils .convertClassNameToResourcePath (DataSourcePluginConfiguration .class .getName ()) + ClassUtils .CLASS_FILE_SUFFIX ;
141+ beanDefinition .setResource (new ClassPathResource (resourcePath ));
142+ registry .registerBeanDefinition (Settings .SETTING_DATASOURCE + "_" + dataSource .getName (), beanDefinition );
143+ }
144+ });
145+ }
146+ }
147+
101148}
0 commit comments