|
32 | 32 | import org.springframework.beans.factory.UnsatisfiedDependencyException;
|
33 | 33 | import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
34 | 34 | import org.springframework.beans.factory.config.ConstructorArgumentValues;
|
| 35 | +import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
35 | 36 | import org.springframework.context.annotation.AnnotationConfigUtils;
|
36 | 37 | import org.springframework.context.support.GenericApplicationContext;
|
37 | 38 |
|
38 | 39 | import static org.assertj.core.api.Assertions.assertThat;
|
39 | 40 | import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
40 | 41 |
|
41 | 42 | /**
|
42 |
| - * Integration tests for handling JSR-303 {@link jakarta.inject.Qualifier} annotations. |
| 43 | + * Integration tests for handling JSR-330 {@link jakarta.inject.Qualifier} and |
| 44 | + * {@link javax.inject.Qualifier} annotations. |
43 | 45 | *
|
44 | 46 | * @author Juergen Hoeller
|
| 47 | + * @author Sam Brannen |
45 | 48 | * @since 3.0
|
46 | 49 | */
|
47 | 50 | class InjectAnnotationAutowireContextTests {
|
@@ -304,6 +307,26 @@ void autowiredConstructorArgumentResolvesQualifiedCandidate() {
|
304 | 307 | assertThat(bean.getPerson().getName()).isEqualTo(JUERGEN);
|
305 | 308 | }
|
306 | 309 |
|
| 310 | + @Test // gh-33345 |
| 311 | + void autowiredConstructorArgumentResolvesJakartaNamedCandidate() { |
| 312 | + Class<JakartaNamedConstructorArgumentTestBean> testBeanClass = JakartaNamedConstructorArgumentTestBean.class; |
| 313 | + AnnotationConfigApplicationContext context = |
| 314 | + new AnnotationConfigApplicationContext(testBeanClass, JakartaCat.class, JakartaDog.class); |
| 315 | + JakartaNamedConstructorArgumentTestBean bean = context.getBean(testBeanClass); |
| 316 | + assertThat(bean.getAnimal1().getName()).isEqualTo("Jakarta Tiger"); |
| 317 | + assertThat(bean.getAnimal2().getName()).isEqualTo("Jakarta Fido"); |
| 318 | + } |
| 319 | + |
| 320 | + @Test // gh-33345 |
| 321 | + void autowiredConstructorArgumentResolvesJavaxNamedCandidate() { |
| 322 | + Class<JavaxNamedConstructorArgumentTestBean> testBeanClass = JavaxNamedConstructorArgumentTestBean.class; |
| 323 | + AnnotationConfigApplicationContext context = |
| 324 | + new AnnotationConfigApplicationContext(testBeanClass, JavaxCat.class, JavaxDog.class); |
| 325 | + JavaxNamedConstructorArgumentTestBean bean = context.getBean(testBeanClass); |
| 326 | + assertThat(bean.getAnimal1().getName()).isEqualTo("Javax Tiger"); |
| 327 | + assertThat(bean.getAnimal2().getName()).isEqualTo("Javax Fido"); |
| 328 | + } |
| 329 | + |
307 | 330 | @Test
|
308 | 331 | void autowiredFieldResolvesQualifiedCandidateWithDefaultValueAndNoValueOnBeanDefinition() {
|
309 | 332 | GenericApplicationContext context = new GenericApplicationContext();
|
@@ -541,6 +564,52 @@ public Person getPerson() {
|
541 | 564 | }
|
542 | 565 |
|
543 | 566 |
|
| 567 | + static class JakartaNamedConstructorArgumentTestBean { |
| 568 | + |
| 569 | + private final Animal animal1; |
| 570 | + private final Animal animal2; |
| 571 | + |
| 572 | + @jakarta.inject.Inject |
| 573 | + public JakartaNamedConstructorArgumentTestBean(@jakarta.inject.Named("Cat") Animal animal1, |
| 574 | + @jakarta.inject.Named("Dog") Animal animal2) { |
| 575 | + |
| 576 | + this.animal1 = animal1; |
| 577 | + this.animal2 = animal2; |
| 578 | + } |
| 579 | + |
| 580 | + public Animal getAnimal1() { |
| 581 | + return this.animal1; |
| 582 | + } |
| 583 | + |
| 584 | + public Animal getAnimal2() { |
| 585 | + return this.animal2; |
| 586 | + } |
| 587 | + } |
| 588 | + |
| 589 | + |
| 590 | + static class JavaxNamedConstructorArgumentTestBean { |
| 591 | + |
| 592 | + private final Animal animal1; |
| 593 | + private final Animal animal2; |
| 594 | + |
| 595 | + @javax.inject.Inject |
| 596 | + public JavaxNamedConstructorArgumentTestBean(@javax.inject.Named("Cat") Animal animal1, |
| 597 | + @javax.inject.Named("Dog") Animal animal2) { |
| 598 | + |
| 599 | + this.animal1 = animal1; |
| 600 | + this.animal2 = animal2; |
| 601 | + } |
| 602 | + |
| 603 | + public Animal getAnimal1() { |
| 604 | + return this.animal1; |
| 605 | + } |
| 606 | + |
| 607 | + public Animal getAnimal2() { |
| 608 | + return this.animal2; |
| 609 | + } |
| 610 | + } |
| 611 | + |
| 612 | + |
544 | 613 | public static class QualifiedFieldWithDefaultValueTestBean {
|
545 | 614 |
|
546 | 615 | @Inject
|
@@ -620,6 +689,52 @@ public QualifiedPerson(String name) {
|
620 | 689 | }
|
621 | 690 |
|
622 | 691 |
|
| 692 | + interface Animal { |
| 693 | + |
| 694 | + String getName(); |
| 695 | + } |
| 696 | + |
| 697 | + |
| 698 | + @jakarta.inject.Named("Cat") |
| 699 | + static class JakartaCat implements Animal { |
| 700 | + |
| 701 | + @Override |
| 702 | + public String getName() { |
| 703 | + return "Jakarta Tiger"; |
| 704 | + } |
| 705 | + } |
| 706 | + |
| 707 | + |
| 708 | + @javax.inject.Named("Cat") |
| 709 | + static class JavaxCat implements Animal { |
| 710 | + |
| 711 | + @Override |
| 712 | + public String getName() { |
| 713 | + return "Javax Tiger"; |
| 714 | + } |
| 715 | + } |
| 716 | + |
| 717 | + |
| 718 | + @jakarta.inject.Named("Dog") |
| 719 | + static class JakartaDog implements Animal { |
| 720 | + |
| 721 | + @Override |
| 722 | + public String getName() { |
| 723 | + return "Jakarta Fido"; |
| 724 | + } |
| 725 | + } |
| 726 | + |
| 727 | + |
| 728 | + @javax.inject.Named("Dog") |
| 729 | + static class JavaxDog implements Animal { |
| 730 | + |
| 731 | + @Override |
| 732 | + public String getName() { |
| 733 | + return "Javax Fido"; |
| 734 | + } |
| 735 | + } |
| 736 | + |
| 737 | + |
623 | 738 | @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
|
624 | 739 | @Retention(RetentionPolicy.RUNTIME)
|
625 | 740 | @Qualifier
|
|
0 commit comments