|
16 | 16 |
|
17 | 17 | package org.springframework.boot.autoconfigure.data.neo4j;
|
18 | 18 |
|
19 |
| -import java.util.List; |
| 19 | +import java.util.Set; |
20 | 20 |
|
21 |
| -import org.neo4j.ogm.session.SessionFactory; |
22 |
| -import org.neo4j.ogm.session.event.EventListener; |
| 21 | +import org.neo4j.driver.Driver; |
23 | 22 |
|
24 |
| -import org.springframework.beans.factory.BeanFactory; |
25 | 23 | import org.springframework.beans.factory.ObjectProvider;
|
26 |
| -import org.springframework.boot.autoconfigure.AutoConfigurationPackages; |
| 24 | +import org.springframework.boot.autoconfigure.AutoConfigureAfter; |
| 25 | +import org.springframework.boot.autoconfigure.AutoConfigureBefore; |
27 | 26 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
| 27 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; |
28 | 28 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
29 | 29 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
30 |
| -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
31 |
| -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; |
32 |
| -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; |
33 |
| -import org.springframework.boot.autoconfigure.domain.EntityScanPackages; |
| 30 | +import org.springframework.boot.autoconfigure.domain.EntityScanner; |
| 31 | +import org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration; |
| 32 | +import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration; |
34 | 33 | import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
|
35 | 34 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
| 35 | +import org.springframework.context.ApplicationContext; |
36 | 36 | import org.springframework.context.annotation.Bean;
|
37 | 37 | import org.springframework.context.annotation.Configuration;
|
38 | 38 | import org.springframework.context.annotation.Import;
|
39 |
| -import org.springframework.data.neo4j.transaction.Neo4jTransactionManager; |
40 |
| -import org.springframework.data.neo4j.web.support.OpenSessionInViewInterceptor; |
| 39 | +import org.springframework.data.neo4j.config.Neo4jDefaultCallbacksRegistrar; |
| 40 | +import org.springframework.data.neo4j.core.DatabaseSelectionProvider; |
| 41 | +import org.springframework.data.neo4j.core.Neo4jClient; |
| 42 | +import org.springframework.data.neo4j.core.Neo4jOperations; |
| 43 | +import org.springframework.data.neo4j.core.Neo4jTemplate; |
| 44 | +import org.springframework.data.neo4j.core.convert.Neo4jConversions; |
| 45 | +import org.springframework.data.neo4j.core.mapping.Neo4jMappingContext; |
| 46 | +import org.springframework.data.neo4j.core.schema.Node; |
| 47 | +import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager; |
| 48 | +import org.springframework.data.neo4j.repository.config.Neo4jRepositoryConfigurationExtension; |
41 | 49 | import org.springframework.transaction.PlatformTransactionManager;
|
42 |
| -import org.springframework.util.StringUtils; |
43 |
| -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; |
44 |
| -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
45 | 50 |
|
46 | 51 | /**
|
47 | 52 | * {@link EnableAutoConfiguration Auto-configuration} for Spring Data Neo4j.
|
|
51 | 56 | * @author Vince Bickers
|
52 | 57 | * @author Stephane Nicoll
|
53 | 58 | * @author Kazuki Shimizu
|
54 |
| - * @author Michael Simons |
| 59 | + * @author Michael J. Simons |
55 | 60 | * @since 1.4.0
|
56 | 61 | */
|
57 | 62 | @Configuration(proxyBeanMethods = false)
|
58 |
| -@ConditionalOnClass({ SessionFactory.class, Neo4jTransactionManager.class, PlatformTransactionManager.class }) |
59 |
| -@EnableConfigurationProperties(Neo4jProperties.class) |
60 |
| -@Import(Neo4jBookmarkManagementConfiguration.class) |
| 63 | +@ConditionalOnClass({ Driver.class, Neo4jTransactionManager.class, PlatformTransactionManager.class }) |
| 64 | +@EnableConfigurationProperties(Neo4jDataProperties.class) |
| 65 | +@ConditionalOnBean(Driver.class) |
| 66 | +@AutoConfigureBefore(TransactionAutoConfiguration.class) |
| 67 | +@AutoConfigureAfter(Neo4jAutoConfiguration.class) |
| 68 | +@Import(Neo4jDefaultCallbacksRegistrar.class) |
61 | 69 | public class Neo4jDataAutoConfiguration {
|
62 | 70 |
|
63 | 71 | @Bean
|
64 |
| - @ConditionalOnMissingBean(PlatformTransactionManager.class) |
65 |
| - public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory, |
66 |
| - ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) { |
67 |
| - Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(sessionFactory); |
68 |
| - transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager)); |
69 |
| - return transactionManager; |
| 72 | + @ConditionalOnMissingBean |
| 73 | + public Neo4jConversions neo4jConversions() { |
| 74 | + return new Neo4jConversions(); |
70 | 75 | }
|
71 | 76 |
|
72 |
| - @Configuration(proxyBeanMethods = false) |
73 |
| - @ConditionalOnMissingBean(SessionFactory.class) |
74 |
| - static class Neo4jOgmSessionFactoryConfiguration { |
75 |
| - |
76 |
| - @Bean |
77 |
| - @ConditionalOnMissingBean |
78 |
| - org.neo4j.ogm.config.Configuration configuration(Neo4jProperties properties) { |
79 |
| - return properties.createConfiguration(); |
80 |
| - } |
81 |
| - |
82 |
| - @Bean |
83 |
| - SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration, BeanFactory beanFactory, |
84 |
| - ObjectProvider<EventListener> eventListeners) { |
85 |
| - SessionFactory sessionFactory = new SessionFactory(configuration, getPackagesToScan(beanFactory)); |
86 |
| - eventListeners.orderedStream().forEach(sessionFactory::register); |
87 |
| - return sessionFactory; |
88 |
| - } |
89 |
| - |
90 |
| - private String[] getPackagesToScan(BeanFactory beanFactory) { |
91 |
| - List<String> packages = EntityScanPackages.get(beanFactory).getPackageNames(); |
92 |
| - if (packages.isEmpty() && AutoConfigurationPackages.has(beanFactory)) { |
93 |
| - packages = AutoConfigurationPackages.get(beanFactory); |
94 |
| - } |
95 |
| - return StringUtils.toStringArray(packages); |
96 |
| - } |
97 |
| - |
| 77 | + @Bean |
| 78 | + @ConditionalOnMissingBean |
| 79 | + public Neo4jMappingContext neo4jMappingContext(ApplicationContext applicationContext, |
| 80 | + Neo4jConversions neo4jConversions) throws ClassNotFoundException { |
| 81 | + Set<Class<?>> initialEntityClasses = new EntityScanner(applicationContext).scan(Node.class); |
| 82 | + Neo4jMappingContext context = new Neo4jMappingContext(neo4jConversions); |
| 83 | + context.setInitialEntitySet(initialEntityClasses); |
| 84 | + return context; |
98 | 85 | }
|
99 | 86 |
|
100 |
| - @Configuration(proxyBeanMethods = false) |
101 |
| - @ConditionalOnWebApplication(type = Type.SERVLET) |
102 |
| - @ConditionalOnClass({ WebMvcConfigurer.class, OpenSessionInViewInterceptor.class }) |
103 |
| - @ConditionalOnMissingBean(OpenSessionInViewInterceptor.class) |
104 |
| - @ConditionalOnProperty(prefix = "spring.data.neo4j", name = "open-in-view", havingValue = "true") |
105 |
| - static class Neo4jWebConfiguration { |
106 |
| - |
107 |
| - @Bean |
108 |
| - OpenSessionInViewInterceptor neo4jOpenSessionInViewInterceptor() { |
109 |
| - return new OpenSessionInViewInterceptor(); |
110 |
| - } |
111 |
| - |
112 |
| - @Bean |
113 |
| - WebMvcConfigurer neo4jOpenSessionInViewInterceptorConfigurer(OpenSessionInViewInterceptor interceptor) { |
114 |
| - return new WebMvcConfigurer() { |
| 87 | + @Bean |
| 88 | + @ConditionalOnMissingBean |
| 89 | + public DatabaseSelectionProvider databaseSelectionProvider(Neo4jDataProperties properties) { |
| 90 | + String database = properties.getDatabase(); |
| 91 | + return (database != null) ? DatabaseSelectionProvider.createStaticDatabaseSelectionProvider(database) |
| 92 | + : DatabaseSelectionProvider.getDefaultSelectionProvider(); |
| 93 | + } |
115 | 94 |
|
116 |
| - @Override |
117 |
| - public void addInterceptors(InterceptorRegistry registry) { |
118 |
| - registry.addWebRequestInterceptor(interceptor); |
119 |
| - } |
| 95 | + @Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_CLIENT_BEAN_NAME) |
| 96 | + @ConditionalOnMissingBean |
| 97 | + public Neo4jClient neo4jClient(Driver driver) { |
| 98 | + return Neo4jClient.create(driver); |
| 99 | + } |
120 | 100 |
|
121 |
| - }; |
122 |
| - } |
| 101 | + @Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_TEMPLATE_BEAN_NAME) |
| 102 | + @ConditionalOnMissingBean(Neo4jOperations.class) |
| 103 | + public Neo4jTemplate neo4jTemplate(Neo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext, |
| 104 | + DatabaseSelectionProvider databaseNameProvider) { |
| 105 | + return new Neo4jTemplate(neo4jClient, neo4jMappingContext, databaseNameProvider); |
| 106 | + } |
123 | 107 |
|
| 108 | + @Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_TRANSACTION_MANAGER_BEAN_NAME) |
| 109 | + @ConditionalOnMissingBean(PlatformTransactionManager.class) |
| 110 | + public Neo4jTransactionManager transactionManager(Driver driver, DatabaseSelectionProvider databaseNameProvider, |
| 111 | + ObjectProvider<TransactionManagerCustomizers> optionalCustomizers) { |
| 112 | + Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(driver, databaseNameProvider); |
| 113 | + optionalCustomizers.ifAvailable((customizer) -> customizer.customize(transactionManager)); |
| 114 | + return transactionManager; |
124 | 115 | }
|
125 | 116 |
|
126 | 117 | }
|
0 commit comments