11/*
2- * Copyright 2002-2024 the original author or authors.
2+ * Copyright 2002-2025 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
5858 * @author Juergen Hoeller
5959 * @author Stephane Nicoll
6060 * @author Sam Brannen
61+ * @author Yanming Zhou
6162 * @since 3.1
6263 */
6364class EnableTransactionManagementTests {
@@ -243,8 +244,8 @@ void transactionalEventListenerRegisteredProperly() {
243244 }
244245
245246 @ Test
246- void spr11915TransactionManagerAsManualSingleton () {
247- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (Spr11915Config .class );
247+ void transactionManagerAsManualSingleton () {
248+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (ManualSingletonConfig .class );
248249 TransactionalTestBean bean = ctx .getBean (TransactionalTestBean .class );
249250 CallCountingTransactionManager txManager = ctx .getBean ("qualifiedTransactionManager" , CallCountingTransactionManager .class );
250251
@@ -264,25 +265,49 @@ void spr11915TransactionManagerAsManualSingleton() {
264265 }
265266
266267 @ Test
267- void gh24291TransactionManagerViaQualifierAnnotation () {
268- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (Gh24291Config .class );
269- TransactionalTestBean bean = ctx .getBean (TransactionalTestBean .class );
270- CallCountingTransactionManager txManager = ctx .getBean ("qualifiedTransactionManager" , CallCountingTransactionManager .class );
268+ void transactionManagerViaQualifierAnnotation () {
269+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext (QualifiedTransactionConfig .class );
270+
271+ TransactionalTestBean bean = ctx .getBean ("testBean" , TransactionalTestBean .class );
272+ TransactionalTestBeanWithNonExistentQualifier beanWithNonExistentQualifier = ctx .getBean (
273+ "testBeanWithNonExistentQualifier" , TransactionalTestBeanWithNonExistentQualifier .class );
274+ TransactionalTestBeanWithInvalidQualifier beanWithInvalidQualifier = ctx .getBean (
275+ "testBeanWithInvalidQualifier" , TransactionalTestBeanWithInvalidQualifier .class );
276+
277+ CallCountingTransactionManager qualified = ctx .getBean ("qualifiedTransactionManager" ,
278+ CallCountingTransactionManager .class );
279+ CallCountingTransactionManager primary = ctx .getBean ("primaryTransactionManager" ,
280+ CallCountingTransactionManager .class );
271281
272282 bean .saveQualifiedFoo ();
273- assertThat (txManager .begun ).isEqualTo (1 );
274- assertThat (txManager .commits ).isEqualTo (1 );
275- assertThat (txManager .rollbacks ).isEqualTo (0 );
283+ assertThat (qualified .begun ).isEqualTo (1 );
284+ assertThat (qualified .commits ).isEqualTo (1 );
285+ assertThat (qualified .rollbacks ).isEqualTo (0 );
276286
277287 bean .saveQualifiedFooWithAttributeAlias ();
278- assertThat (txManager .begun ).isEqualTo (2 );
279- assertThat (txManager .commits ).isEqualTo (2 );
280- assertThat (txManager .rollbacks ).isEqualTo (0 );
288+ assertThat (qualified .begun ).isEqualTo (2 );
289+ assertThat (qualified .commits ).isEqualTo (2 );
290+ assertThat (qualified .rollbacks ).isEqualTo (0 );
281291
282292 bean .findAllFoos ();
283- assertThat (txManager .begun ).isEqualTo (3 );
284- assertThat (txManager .commits ).isEqualTo (3 );
285- assertThat (txManager .rollbacks ).isEqualTo (0 );
293+ assertThat (qualified .begun ).isEqualTo (3 );
294+ assertThat (qualified .commits ).isEqualTo (3 );
295+ assertThat (qualified .rollbacks ).isEqualTo (0 );
296+
297+ beanWithNonExistentQualifier .findAllFoos ();
298+ assertThat (primary .begun ).isEqualTo (1 );
299+ assertThat (primary .commits ).isEqualTo (1 );
300+ assertThat (primary .rollbacks ).isEqualTo (0 );
301+
302+ beanWithInvalidQualifier .findAllFoos ();
303+ assertThat (primary .begun ).isEqualTo (2 );
304+ assertThat (primary .commits ).isEqualTo (2 );
305+ assertThat (primary .rollbacks ).isEqualTo (0 );
306+
307+ // no further access to qualified transaction manager
308+ assertThat (qualified .begun ).isEqualTo (3 );
309+ assertThat (qualified .commits ).isEqualTo (3 );
310+ assertThat (qualified .rollbacks ).isEqualTo (0 );
286311
287312 ctx .close ();
288313 }
@@ -386,6 +411,16 @@ public void saveQualifiedFooWithAttributeAlias() {
386411 public static class TransactionalTestBeanSubclass extends TransactionalTestBean {
387412 }
388413
414+ @ Service
415+ @ Qualifier ("nonExistentBean" )
416+ public static class TransactionalTestBeanWithNonExistentQualifier extends TransactionalTestBean {
417+ }
418+
419+ @ Service
420+ @ Qualifier ("transactionalTestBeanWithInvalidQualifier" )
421+ public static class TransactionalTestBeanWithInvalidQualifier extends TransactionalTestBean {
422+ }
423+
389424
390425 @ Configuration
391426 static class PlaceholderConfig {
@@ -558,7 +593,7 @@ public PlatformTransactionManager annotationDrivenTransactionManager() {
558593 @ Configuration
559594 @ EnableTransactionManagement
560595 @ Import (PlaceholderConfig .class )
561- static class Spr11915Config {
596+ static class ManualSingletonConfig {
562597
563598 @ Autowired
564599 public void initializeApp (ConfigurableApplicationContext applicationContext ) {
@@ -581,7 +616,7 @@ public CallCountingTransactionManager otherTxManager() {
581616 @ Configuration
582617 @ EnableTransactionManagement
583618 @ Import (PlaceholderConfig .class )
584- static class Gh24291Config {
619+ static class QualifiedTransactionConfig {
585620
586621 @ Autowired
587622 public void initializeApp (ConfigurableApplicationContext applicationContext ) {
@@ -596,7 +631,18 @@ public TransactionalTestBeanSubclass testBean() {
596631 }
597632
598633 @ Bean
599- public CallCountingTransactionManager otherTxManager () {
634+ public TransactionalTestBeanWithNonExistentQualifier testBeanWithNonExistentQualifier () {
635+ return new TransactionalTestBeanWithNonExistentQualifier ();
636+ }
637+
638+ @ Bean
639+ public TransactionalTestBeanWithInvalidQualifier testBeanWithInvalidQualifier () {
640+ return new TransactionalTestBeanWithInvalidQualifier ();
641+ }
642+
643+ @ Bean
644+ @ Primary
645+ public CallCountingTransactionManager primaryTransactionManager () {
600646 return new CallCountingTransactionManager ();
601647 }
602648 }
0 commit comments