31
31
import org .springframework .context .annotation .Conditional ;
32
32
import org .springframework .context .annotation .Configuration ;
33
33
import org .springframework .context .annotation .ConfigurationCondition ;
34
+ import org .springframework .context .annotation .Primary ;
34
35
import org .springframework .core .type .AnnotatedTypeMetadata ;
35
36
import org .springframework .stereotype .Service ;
36
37
import org .springframework .transaction .PlatformTransactionManager ;
@@ -106,7 +107,6 @@ public void txManagerIsResolvedCorrectlyWhenMultipleManagersArePresent() {
106
107
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (
107
108
EnableTxConfig .class , MultiTxManagerConfig .class );
108
109
TransactionalTestBean bean = ctx .getBean (TransactionalTestBean .class );
109
-
110
110
CallCountingTransactionManager txManager = ctx .getBean ("txManager" , CallCountingTransactionManager .class );
111
111
CallCountingTransactionManager txManager2 = ctx .getBean ("txManager2" , CallCountingTransactionManager .class );
112
112
@@ -122,6 +122,48 @@ public void txManagerIsResolvedCorrectlyWhenMultipleManagersArePresent() {
122
122
ctx .close ();
123
123
}
124
124
125
+ @ Test
126
+ public void txManagerIsResolvedCorrectlyWhenMultipleManagersArePresentAndOneIsPrimary () {
127
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (
128
+ EnableTxConfig .class , PrimaryMultiTxManagerConfig .class );
129
+ TransactionalTestBean bean = ctx .getBean (TransactionalTestBean .class );
130
+ CallCountingTransactionManager primary = ctx .getBean ("primary" , CallCountingTransactionManager .class );
131
+ CallCountingTransactionManager txManager2 = ctx .getBean ("txManager2" , CallCountingTransactionManager .class );
132
+
133
+ // invoke a transactional method, causing the PlatformTransactionManager bean to be resolved.
134
+ bean .findAllFoos ();
135
+
136
+ assertThat (primary .begun ).isEqualTo (1 );
137
+ assertThat (primary .commits ).isEqualTo (1 );
138
+ assertThat (primary .rollbacks ).isEqualTo (0 );
139
+ assertThat (txManager2 .begun ).isEqualTo (0 );
140
+ assertThat (txManager2 .commits ).isEqualTo (0 );
141
+ assertThat (txManager2 .rollbacks ).isEqualTo (0 );
142
+
143
+ ctx .close ();
144
+ }
145
+
146
+ @ Test
147
+ public void txManagerIsResolvedCorrectlyWithTxMgmtConfigurerAndPrimaryPresent () {
148
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (
149
+ EnableTxConfig .class , PrimaryTxManagerAndTxMgmtConfigurerConfig .class );
150
+ TransactionalTestBean bean = ctx .getBean (TransactionalTestBean .class );
151
+ CallCountingTransactionManager primary = ctx .getBean ("primary" , CallCountingTransactionManager .class );
152
+ CallCountingTransactionManager annotationDriven = ctx .getBean ("annotationDrivenTransactionManager" , CallCountingTransactionManager .class );
153
+
154
+ // invoke a transactional method, causing the PlatformTransactionManager bean to be resolved.
155
+ bean .findAllFoos ();
156
+
157
+ assertThat (primary .begun ).isEqualTo (0 );
158
+ assertThat (primary .commits ).isEqualTo (0 );
159
+ assertThat (primary .rollbacks ).isEqualTo (0 );
160
+ assertThat (annotationDriven .begun ).isEqualTo (1 );
161
+ assertThat (annotationDriven .commits ).isEqualTo (1 );
162
+ assertThat (annotationDriven .rollbacks ).isEqualTo (0 );
163
+
164
+ ctx .close ();
165
+ }
166
+
125
167
/**
126
168
* A cheap test just to prove that in ASPECTJ mode, the AnnotationTransactionAspect does indeed
127
169
* get loaded -- or in this case, attempted to be loaded at which point the test fails.
@@ -295,6 +337,49 @@ public PlatformTransactionManager annotationDrivenTransactionManager() {
295
337
}
296
338
297
339
340
+ @ Configuration
341
+ static class PrimaryMultiTxManagerConfig {
342
+
343
+ @ Bean
344
+ public TransactionalTestBean testBean () {
345
+ return new TransactionalTestBean ();
346
+ }
347
+
348
+ @ Bean
349
+ @ Primary
350
+ public PlatformTransactionManager primary () {
351
+ return new CallCountingTransactionManager ();
352
+ }
353
+
354
+ @ Bean
355
+ public PlatformTransactionManager txManager2 () {
356
+ return new CallCountingTransactionManager ();
357
+ }
358
+ }
359
+
360
+
361
+ @ Configuration
362
+ static class PrimaryTxManagerAndTxMgmtConfigurerConfig implements TransactionManagementConfigurer {
363
+
364
+ @ Bean
365
+ public TransactionalTestBean testBean () {
366
+ return new TransactionalTestBean ();
367
+ }
368
+
369
+ @ Bean
370
+ @ Primary
371
+ public PlatformTransactionManager primary () {
372
+ return new CallCountingTransactionManager ();
373
+ }
374
+
375
+ @ Bean
376
+ @ Override
377
+ public PlatformTransactionManager annotationDrivenTransactionManager () {
378
+ return new CallCountingTransactionManager ();
379
+ }
380
+ }
381
+
382
+
298
383
@ Configuration
299
384
@ EnableTransactionManagement
300
385
static class Spr11915Config {
0 commit comments