Skip to content

Commit 274098f

Browse files
michael-simonssnicoll
authored andcommitted
Refine back-off strategy of Neo4j SessionFactory
This commit separates the auto-configuration of the `SessionFactory` in an isolated class so that the rest of the auto-configuration is still applied if the user provides a custom `SessionFactory` bean. See gh-17662
1 parent 308a5e9 commit 274098f

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,29 +53,15 @@
5353
* @author Vince Bickers
5454
* @author Stephane Nicoll
5555
* @author Kazuki Shimizu
56+
* @author Michael Simons
5657
* @since 1.4.0
5758
*/
5859
@Configuration
5960
@ConditionalOnClass({ SessionFactory.class, Neo4jTransactionManager.class, PlatformTransactionManager.class })
60-
@ConditionalOnMissingBean(SessionFactory.class)
6161
@EnableConfigurationProperties(Neo4jProperties.class)
6262
@Import(Neo4jBookmarkManagementConfiguration.class)
6363
public class Neo4jDataAutoConfiguration {
6464

65-
@Bean
66-
@ConditionalOnMissingBean
67-
public org.neo4j.ogm.config.Configuration configuration(Neo4jProperties properties) {
68-
return properties.createConfiguration();
69-
}
70-
71-
@Bean
72-
public SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration,
73-
ApplicationContext applicationContext, ObjectProvider<EventListener> eventListeners) {
74-
SessionFactory sessionFactory = new SessionFactory(configuration, getPackagesToScan(applicationContext));
75-
eventListeners.stream().forEach(sessionFactory::register);
76-
return sessionFactory;
77-
}
78-
7965
@Bean
8066
@ConditionalOnMissingBean(PlatformTransactionManager.class)
8167
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory, Neo4jProperties properties,
@@ -91,12 +77,32 @@ private Neo4jTransactionManager customize(Neo4jTransactionManager transactionMan
9177
return transactionManager;
9278
}
9379

94-
private String[] getPackagesToScan(ApplicationContext applicationContext) {
95-
List<String> packages = EntityScanPackages.get(applicationContext).getPackageNames();
96-
if (packages.isEmpty() && AutoConfigurationPackages.has(applicationContext)) {
97-
packages = AutoConfigurationPackages.get(applicationContext);
80+
@Configuration
81+
@ConditionalOnMissingBean(SessionFactory.class)
82+
protected static class Neo4jOgmSessionFactoryConfiguration {
83+
84+
@Bean
85+
@ConditionalOnMissingBean
86+
public org.neo4j.ogm.config.Configuration configuration(Neo4jProperties properties) {
87+
return properties.createConfiguration();
88+
}
89+
90+
@Bean
91+
public SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration,
92+
ApplicationContext applicationContext, ObjectProvider<EventListener> eventListeners) {
93+
SessionFactory sessionFactory = new SessionFactory(configuration, getPackagesToScan(applicationContext));
94+
eventListeners.stream().forEach(sessionFactory::register);
95+
return sessionFactory;
9896
}
99-
return StringUtils.toStringArray(packages);
97+
98+
private String[] getPackagesToScan(ApplicationContext applicationContext) {
99+
List<String> packages = EntityScanPackages.get(applicationContext).getPackageNames();
100+
if (packages.isEmpty() && AutoConfigurationPackages.has(applicationContext)) {
101+
packages = AutoConfigurationPackages.get(applicationContext);
102+
}
103+
return StringUtils.toStringArray(packages);
104+
}
105+
100106
}
101107

102108
@Configuration

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfigurationTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ public void customSessionFactory() {
9797
});
9898
}
9999

100+
@Test
101+
public void customSessionFactoryShouldNotDisableOtherDefaults() {
102+
this.contextRunner.withUserConfiguration(CustomSessionFactory.class).run((context) -> {
103+
assertThat(context).hasSingleBean(Neo4jTransactionManager.class);
104+
assertThat(context).hasSingleBean(OpenSessionInViewInterceptor.class);
105+
});
106+
}
107+
100108
@Test
101109
public void customConfiguration() {
102110
this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> {

0 commit comments

Comments
 (0)