Skip to content

Commit a3ade22

Browse files
hpoettkercppwfs
authored andcommitted
Let TaskRepository depend on database initializers
1 parent f37577e commit a3ade22

File tree

5 files changed

+103
-11
lines changed

5 files changed

+103
-11
lines changed

spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskAutoConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.boot.autoconfigure.AutoConfiguration;
3131
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3232
import org.springframework.boot.context.properties.EnableConfigurationProperties;
33+
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
3334
import org.springframework.cloud.task.repository.TaskExplorer;
3435
import org.springframework.cloud.task.repository.TaskNameResolver;
3536
import org.springframework.cloud.task.repository.TaskRepository;
@@ -39,7 +40,7 @@
3940
import org.springframework.context.ConfigurableApplicationContext;
4041
import org.springframework.context.annotation.Bean;
4142
import org.springframework.context.annotation.Conditional;
42-
import org.springframework.context.annotation.Lazy;
43+
import org.springframework.context.annotation.Import;
4344
import org.springframework.context.annotation.Profile;
4445
import org.springframework.transaction.PlatformTransactionManager;
4546
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -61,6 +62,7 @@
6162
@ConditionalOnProperty(prefix = "spring.cloud.task.autoconfiguration", name = "enabled", havingValue = "true",
6263
matchIfMissing = true)
6364
// @checkstyle:on
65+
@Import(DatabaseInitializationDependencyConfigurer.class)
6466
public class SimpleTaskAutoConfiguration {
6567

6668
protected static final Log logger = LogFactory.getLog(SimpleTaskAutoConfiguration.class);
@@ -104,7 +106,6 @@ public TaskNameResolver taskNameResolver() {
104106
}
105107

106108
@Bean
107-
@Lazy(false)
108109
public TaskRepositoryInitializer taskRepositoryInitializer() {
109110
TaskRepositoryInitializer taskRepositoryInitializer = new TaskRepositoryInitializer(this.taskProperties);
110111
DataSource initializerDataSource = getDefaultConfigurer().getTaskDataSource();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2022-2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.cloud.task.configuration;
18+
19+
import java.util.Set;
20+
21+
import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDatabaseInitializerDetector;
22+
import org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector;
23+
import org.springframework.cloud.task.repository.support.TaskRepositoryInitializer;
24+
import org.springframework.core.Ordered;
25+
26+
/**
27+
* {@link DatabaseInitializerDetector} for {@link TaskRepositoryInitializer}.
28+
*
29+
* @author Henning Pöttker
30+
*/
31+
class TaskRepositoryDatabaseInitializerDetector extends AbstractBeansOfTypeDatabaseInitializerDetector {
32+
33+
private static final int PRECEDENCE = Ordered.LOWEST_PRECEDENCE - 100;
34+
35+
@Override
36+
protected Set<Class<?>> getDatabaseInitializerBeanTypes() {
37+
return Set.of(TaskRepositoryInitializer.class);
38+
}
39+
40+
@Override
41+
public int getOrder() {
42+
return PRECEDENCE;
43+
}
44+
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2022-2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.cloud.task.configuration;
18+
19+
import java.util.Set;
20+
21+
import org.springframework.boot.sql.init.dependency.AbstractBeansOfTypeDependsOnDatabaseInitializationDetector;
22+
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector;
23+
import org.springframework.cloud.task.repository.TaskRepository;
24+
25+
/**
26+
* {@link DependsOnDatabaseInitializationDetector} for {@link TaskRepository}.
27+
*
28+
* @author Henning Pöttker
29+
*/
30+
class TaskRepositoryDependsOnDatabaseInitializationDetector
31+
extends AbstractBeansOfTypeDependsOnDatabaseInitializationDetector {
32+
33+
@Override
34+
protected Set<Class<?>> getDependsOnDatabaseInitializationBeanTypes() {
35+
return Set.of(TaskRepository.class);
36+
}
37+
38+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector=\
2+
org.springframework.cloud.task.configuration.TaskRepositoryDatabaseInitializerDetector
3+
4+
org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector=\
5+
org.springframework.cloud.task.configuration.TaskRepositoryDependsOnDatabaseInitializationDetector

spring-cloud-task-core/src/test/java/org/springframework/cloud/task/SimpleTaskAutoConfigurationTests.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.beans.factory.config.BeanDefinitionHolder;
30+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3031
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
3132
import org.springframework.beans.factory.support.GenericBeanDefinition;
32-
import org.springframework.boot.LazyInitializationBeanFactoryPostProcessor;
3333
import org.springframework.boot.autoconfigure.AutoConfigurations;
3434
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
3535
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
@@ -103,16 +103,19 @@ public void testRepositoryInitialized() {
103103
}
104104

105105
@Test
106-
public void testRepositoryInitializedWithLazyInitialization() {
107-
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner().withInitializer(
108-
(context) -> context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()))
109-
.withConfiguration(AutoConfigurations.of(EmbeddedDataSourceConfiguration.class,
110-
PropertyPlaceholderAutoConfiguration.class, SimpleTaskAutoConfiguration.class,
111-
SingleTaskConfiguration.class))
106+
public void testRepositoryBeansDependOnTaskRepositoryInitializer() {
107+
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner().withConfiguration(
108+
AutoConfigurations.of(EmbeddedDataSourceConfiguration.class, PropertyPlaceholderAutoConfiguration.class,
109+
SimpleTaskAutoConfiguration.class, SingleTaskConfiguration.class))
112110
.withUserConfiguration(TaskLifecycleListenerConfiguration.class);
113111
applicationContextRunner.run((context) -> {
114-
TaskExplorer taskExplorer = context.getBean(TaskExplorer.class);
115-
assertThat(taskExplorer.getTaskExecutionCount()).isEqualTo(1L);
112+
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
113+
String[] taskRepositoryNames = beanFactory.getBeanNamesForType(TaskRepository.class);
114+
assertThat(taskRepositoryNames).isNotEmpty();
115+
for (String taskRepositoryName : taskRepositoryNames) {
116+
assertThat(beanFactory.getBeanDefinition(taskRepositoryName).getDependsOn())
117+
.contains("taskRepositoryInitializer");
118+
}
116119
});
117120
}
118121

0 commit comments

Comments
 (0)