Skip to content

Commit 99e7266

Browse files
committed
Polish spring transaction manager properties
Polish and update contribution so that TransactionManager properties can be defined per technology, rather than globally. Closes gh-7561
1 parent 80eee6b commit 99e7266

21 files changed

+154
-120
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@
3030
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
3131
import org.springframework.batch.core.repository.JobRepository;
3232
import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
33-
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3433
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
3534
import org.springframework.orm.jpa.JpaTransactionManager;
3635
import org.springframework.transaction.PlatformTransactionManager;
36+
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
3737
import org.springframework.util.StringUtils;
3838

3939
/**
@@ -49,8 +49,6 @@ public class BasicBatchConfigurer implements BatchConfigurer {
4949

5050
private final BatchProperties properties;
5151

52-
private final TransactionProperties transactionProperties;
53-
5452
private final DataSource dataSource;
5553

5654
private final EntityManagerFactory entityManagerFactory;
@@ -66,24 +64,21 @@ public class BasicBatchConfigurer implements BatchConfigurer {
6664
/**
6765
* Create a new {@link BasicBatchConfigurer} instance.
6866
* @param properties the batch properties
69-
* @param transactionProperties the transaction properties
7067
* @param dataSource the underlying data source
7168
*/
72-
protected BasicBatchConfigurer(BatchProperties properties, TransactionProperties transactionProperties, DataSource dataSource) {
73-
this(properties, transactionProperties, dataSource, null);
69+
protected BasicBatchConfigurer(BatchProperties properties, DataSource dataSource) {
70+
this(properties, dataSource, null);
7471
}
7572

7673
/**
7774
* Create a new {@link BasicBatchConfigurer} instance.
7875
* @param properties the batch properties
79-
* @param transactionProperties the transaction properties
8076
* @param dataSource the underlying data source
8177
* @param entityManagerFactory the entity manager factory (or {@code null})
8278
*/
83-
protected BasicBatchConfigurer(BatchProperties properties, TransactionProperties transactionProperties, DataSource dataSource,
79+
protected BasicBatchConfigurer(BatchProperties properties, DataSource dataSource,
8480
EntityManagerFactory entityManagerFactory) {
8581
this.properties = properties;
86-
this.transactionProperties = transactionProperties;
8782
this.entityManagerFactory = entityManagerFactory;
8883
this.dataSource = dataSource;
8984
}
@@ -157,15 +152,16 @@ protected JobRepository createJobRepository() throws Exception {
157152
}
158153

159154
protected PlatformTransactionManager createTransactionManager() {
160-
PlatformTransactionManager txManager;
155+
AbstractPlatformTransactionManager transactionManager = createAppropriateTransactionManager();
156+
this.properties.getTransaction().applyTo(transactionManager);
157+
return transactionManager;
158+
}
159+
160+
private AbstractPlatformTransactionManager createAppropriateTransactionManager() {
161161
if (this.entityManagerFactory != null) {
162-
txManager = new JpaTransactionManager(this.entityManagerFactory);
163-
}
164-
else {
165-
txManager = new DataSourceTransactionManager(this.dataSource);
162+
return new JpaTransactionManager(this.entityManagerFactory);
166163
}
167-
this.transactionProperties.applyTo(txManager);
168-
return txManager;
164+
return new DataSourceTransactionManager(this.dataSource);
169165
}
170166

171167
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3838
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3939
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
40-
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
4140
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4241
import org.springframework.context.annotation.Bean;
4342
import org.springframework.context.annotation.Configuration;
@@ -136,18 +135,16 @@ public SimpleJobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLau
136135
return factory;
137136
}
138137

139-
@EnableConfigurationProperties({BatchProperties.class, TransactionProperties.class})
138+
@EnableConfigurationProperties(BatchProperties.class)
140139
@ConditionalOnClass(value = PlatformTransactionManager.class, name = "javax.persistence.EntityManagerFactory")
141140
@ConditionalOnMissingBean(BatchConfigurer.class)
142141
@Configuration
143142
protected static class JpaBatchConfiguration {
144143

145144
private final BatchProperties properties;
146-
private final TransactionProperties transactionProperties;
147145

148-
protected JpaBatchConfiguration(BatchProperties properties, TransactionProperties transactionProperties) {
146+
protected JpaBatchConfiguration(BatchProperties properties) {
149147
this.properties = properties;
150-
this.transactionProperties = transactionProperties;
151148
}
152149

153150
// The EntityManagerFactory may not be discoverable by type when this condition
@@ -157,14 +154,14 @@ protected JpaBatchConfiguration(BatchProperties properties, TransactionPropertie
157154
@ConditionalOnBean(name = "entityManagerFactory")
158155
public BasicBatchConfigurer jpaBatchConfigurer(DataSource dataSource,
159156
EntityManagerFactory entityManagerFactory) {
160-
return new BasicBatchConfigurer(this.properties, this.transactionProperties, dataSource,
157+
return new BasicBatchConfigurer(this.properties, dataSource,
161158
entityManagerFactory);
162159
}
163160

164161
@Bean
165162
@ConditionalOnMissingBean(name = "entityManagerFactory")
166163
public BasicBatchConfigurer basicBatchConfigurer(DataSource dataSource) {
167-
return new BasicBatchConfigurer(this.properties, this.transactionProperties, dataSource);
164+
return new BasicBatchConfigurer(this.properties, dataSource);
168165
}
169166

170167
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package org.springframework.boot.autoconfigure.batch;
1818

19+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
1920
import org.springframework.boot.context.properties.ConfigurationProperties;
21+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2022

2123
/**
2224
* Configuration properties for Spring Batch.
@@ -46,6 +48,9 @@ public class BatchProperties {
4648

4749
private final Job job = new Job();
4850

51+
@NestedConfigurationProperty
52+
private final TransactionProperties transaction = new TransactionProperties();
53+
4954
public String getSchema() {
5055
return this.schema;
5156
}
@@ -54,6 +59,14 @@ public void setSchema(String schema) {
5459
this.schema = schema;
5560
}
5661

62+
public String getTablePrefix() {
63+
return this.tablePrefix;
64+
}
65+
66+
public void setTablePrefix(String tablePrefix) {
67+
this.tablePrefix = tablePrefix;
68+
}
69+
5770
public Initializer getInitializer() {
5871
return this.initializer;
5972
}
@@ -62,12 +75,8 @@ public Job getJob() {
6275
return this.job;
6376
}
6477

65-
public void setTablePrefix(String tablePrefix) {
66-
this.tablePrefix = tablePrefix;
67-
}
68-
69-
public String getTablePrefix() {
70-
return this.tablePrefix;
78+
public TransactionProperties getTransaction() {
79+
return this.transaction;
7180
}
7281

7382
public class Initializer {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
3131
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
32-
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3332
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3433
import org.springframework.context.ApplicationContext;
3534
import org.springframework.context.annotation.Bean;
@@ -53,9 +52,9 @@
5352
* @since 1.4.0
5453
*/
5554
@Configuration
56-
@ConditionalOnClass({SessionFactory.class, PlatformTransactionManager.class})
55+
@ConditionalOnClass({ SessionFactory.class, PlatformTransactionManager.class })
5756
@ConditionalOnMissingBean(SessionFactory.class)
58-
@EnableConfigurationProperties({Neo4jProperties.class, TransactionProperties.class})
57+
@EnableConfigurationProperties(Neo4jProperties.class)
5958
@SuppressWarnings("deprecation")
6059
public class Neo4jDataAutoConfiguration {
6160

@@ -90,9 +89,10 @@ public Neo4jTemplate neo4jTemplate(SessionFactory sessionFactory) {
9089
@Bean
9190
@ConditionalOnMissingBean(PlatformTransactionManager.class)
9291
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory,
93-
TransactionProperties transactionProperties) {
94-
Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(sessionFactory);
95-
transactionProperties.applyTo(transactionManager);
92+
Neo4jProperties properties) {
93+
Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(
94+
sessionFactory);
95+
properties.getTransaction().applyTo(transactionManager);
9696
return transactionManager;
9797
}
9898

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import org.neo4j.ogm.config.DriverConfiguration;
2424

2525
import org.springframework.beans.BeansException;
26+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
2627
import org.springframework.boot.context.properties.ConfigurationProperties;
28+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2729
import org.springframework.context.ApplicationContext;
2830
import org.springframework.context.ApplicationContextAware;
2931
import org.springframework.util.ClassUtils;
@@ -69,6 +71,9 @@ public class Neo4jProperties implements ApplicationContextAware {
6971

7072
private final Embedded embedded = new Embedded();
7173

74+
@NestedConfigurationProperty
75+
private final TransactionProperties transaction = new TransactionProperties();
76+
7277
private ClassLoader classLoader = Neo4jProperties.class.getClassLoader();
7378

7479
public String getUri() {
@@ -107,6 +112,10 @@ public Embedded getEmbedded() {
107112
return this.embedded;
108113
}
109114

115+
public TransactionProperties getTransaction() {
116+
return this.transaction;
117+
}
118+
110119
@Override
111120
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
112121
this.classLoader = ctx.getClassLoader();

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import org.springframework.beans.factory.BeanClassLoaderAware;
2828
import org.springframework.beans.factory.BeanCreationException;
2929
import org.springframework.beans.factory.InitializingBean;
30+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3031
import org.springframework.boot.context.properties.ConfigurationProperties;
32+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
3133
import org.springframework.boot.jdbc.DatabaseDriver;
3234
import org.springframework.context.EnvironmentAware;
3335
import org.springframework.core.env.Environment;
@@ -157,6 +159,9 @@ public class DataSourceProperties
157159

158160
private String uniqueName;
159161

162+
@NestedConfigurationProperty
163+
private final TransactionProperties transaction = new TransactionProperties();
164+
160165
@Override
161166
public void setBeanClassLoader(ClassLoader classLoader) {
162167
this.classLoader = classLoader;
@@ -473,6 +478,10 @@ public void setXa(Xa xa) {
473478
this.xa = xa;
474479
}
475480

481+
public TransactionProperties getTransaction() {
482+
return this.transaction;
483+
}
484+
476485
/**
477486
* XA Specific datasource settings.
478487
*/

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
26-
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
2726
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2827
import org.springframework.context.annotation.Bean;
2928
import org.springframework.context.annotation.Configuration;
@@ -46,11 +45,11 @@
4645
@Configuration
4746
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
4847
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
48+
@EnableConfigurationProperties(DataSourceProperties.class)
4949
public class DataSourceTransactionManagerAutoConfiguration {
5050

5151
@Configuration
5252
@ConditionalOnSingleCandidate(DataSource.class)
53-
@EnableConfigurationProperties(TransactionProperties.class)
5453
static class DataSourceTransactionManagerConfiguration {
5554

5655
private final DataSource dataSource;
@@ -61,9 +60,11 @@ static class DataSourceTransactionManagerConfiguration {
6160

6261
@Bean
6362
@ConditionalOnMissingBean(PlatformTransactionManager.class)
64-
public DataSourceTransactionManager transactionManager(TransactionProperties transactionProperties) {
65-
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource);
66-
transactionProperties.applyTo(transactionManager);
63+
public DataSourceTransactionManager transactionManager(
64+
DataSourceProperties properties) {
65+
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(
66+
this.dataSource);
67+
properties.getTransaction().applyTo(transactionManager);
6768
return transactionManager;
6869
}
6970

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
3636
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
37-
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3837
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3938
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
4039
import org.springframework.context.annotation.Bean;
@@ -62,7 +61,7 @@
6261
* @author Andy Wilkinson
6362
* @author Kazuki Shimizu
6463
*/
65-
@EnableConfigurationProperties({JpaProperties.class, TransactionProperties.class})
64+
@EnableConfigurationProperties(JpaProperties.class)
6665
@Import(DataSourceInitializedPublisher.Registrar.class)
6766
public abstract class JpaBaseConfiguration implements BeanFactoryAware {
6867

@@ -83,9 +82,9 @@ protected JpaBaseConfiguration(DataSource dataSource, JpaProperties properties,
8382

8483
@Bean
8584
@ConditionalOnMissingBean(PlatformTransactionManager.class)
86-
public PlatformTransactionManager transactionManager(TransactionProperties transactionProperties) {
85+
public PlatformTransactionManager transactionManager() {
8786
JpaTransactionManager transactionManager = new JpaTransactionManager();
88-
transactionProperties.applyTo(transactionManager);
87+
this.properties.getTransaction().applyTo(transactionManager);
8988
return transactionManager;
9089
}
9190

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaProperties.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.sql.DataSource;
2323

2424
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection;
25+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
2526
import org.springframework.boot.context.properties.ConfigurationProperties;
2627
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2728
import org.springframework.orm.jpa.vendor.Database;
@@ -67,6 +68,9 @@ public class JpaProperties {
6768

6869
private Hibernate hibernate = new Hibernate();
6970

71+
@NestedConfigurationProperty
72+
private final TransactionProperties transaction = new TransactionProperties();
73+
7074
public Map<String, String> getProperties() {
7175
return this.properties;
7276
}
@@ -125,6 +129,10 @@ public Map<String, String> getHibernateProperties(DataSource dataSource) {
125129
return this.hibernate.getAdditionalProperties(this.properties, dataSource);
126130
}
127131

132+
public TransactionProperties getTransaction() {
133+
return this.transaction;
134+
}
135+
128136
public static class Hibernate {
129137

130138
private static final String USE_NEW_ID_GENERATOR_MAPPINGS = "hibernate.id."

0 commit comments

Comments
 (0)