Skip to content

Commit 3863b77

Browse files
committed
Merge branch '6.1.x'
2 parents 4ceefa7 + bcffa15 commit 3863b77

File tree

6 files changed

+301
-172
lines changed

6 files changed

+301
-172
lines changed

spring-beans/spring-beans.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ dependencies {
1616
testImplementation(project(":spring-core-test"))
1717
testImplementation(testFixtures(project(":spring-core")))
1818
testImplementation("jakarta.annotation:jakarta.annotation-api")
19+
testImplementation("javax.inject:javax.inject")
1920
}

spring-beans/src/main/java/org/springframework/beans/factory/annotation/JakartaAnnotationsRuntimeHints.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 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.
@@ -24,16 +24,24 @@
2424
import org.springframework.lang.Nullable;
2525

2626
/**
27-
* {@link RuntimeHintsRegistrar} for Jakarta annotations.
27+
* {@link RuntimeHintsRegistrar} for Jakarta annotations and their pre-Jakarta equivalents.
2828
*
2929
* @author Brian Clozel
30+
* @author Sam Brannen
3031
*/
3132
class JakartaAnnotationsRuntimeHints implements RuntimeHintsRegistrar {
3233

3334
@Override
3435
public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) {
35-
Stream.of("jakarta.inject.Inject", "jakarta.inject.Provider", "jakarta.inject.Qualifier").forEach(typeName ->
36-
hints.reflection().registerType(TypeReference.of(typeName)));
36+
// javax.inject.Provider is omitted from the list, since we do not currently load
37+
// it via reflection.
38+
Stream.of(
39+
"jakarta.inject.Inject",
40+
"jakarta.inject.Provider",
41+
"jakarta.inject.Qualifier",
42+
"javax.inject.Inject",
43+
"javax.inject.Qualifier"
44+
).forEach(typeName -> hints.reflection().registerType(TypeReference.of(typeName)));
3745
}
3846

3947
}

spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,13 @@
4747
* against {@link Qualifier qualifier annotations} on the field or parameter to be autowired.
4848
* Also supports suggested expression values through a {@link Value value} annotation.
4949
*
50-
* <p>Also supports JSR-330's {@link jakarta.inject.Qualifier} annotation, if available.
50+
* <p>Also supports JSR-330's {@link jakarta.inject.Qualifier} annotation (as well as its
51+
* pre-Jakarta {@code javax.inject.Qualifier} equivalent), if available.
5152
*
5253
* @author Mark Fisher
5354
* @author Juergen Hoeller
5455
* @author Stephane Nicoll
56+
* @author Sam Brannen
5557
* @since 2.5
5658
* @see AutowireCandidateQualifier
5759
* @see Qualifier
@@ -65,9 +67,10 @@ public class QualifierAnnotationAutowireCandidateResolver extends GenericTypeAwa
6567

6668

6769
/**
68-
* Create a new QualifierAnnotationAutowireCandidateResolver
69-
* for Spring's standard {@link Qualifier} annotation.
70-
* <p>Also supports JSR-330's {@link jakarta.inject.Qualifier} annotation, if available.
70+
* Create a new {@code QualifierAnnotationAutowireCandidateResolver} for Spring's
71+
* standard {@link Qualifier} annotation.
72+
* <p>Also supports JSR-330's {@link jakarta.inject.Qualifier} annotation (as well as
73+
* its pre-Jakarta {@code javax.inject.Qualifier} equivalent), if available.
7174
*/
7275
@SuppressWarnings("unchecked")
7376
public QualifierAnnotationAutowireCandidateResolver() {
@@ -76,14 +79,21 @@ public QualifierAnnotationAutowireCandidateResolver() {
7679
this.qualifierTypes.add((Class<? extends Annotation>) ClassUtils.forName("jakarta.inject.Qualifier",
7780
QualifierAnnotationAutowireCandidateResolver.class.getClassLoader()));
7881
}
82+
catch (ClassNotFoundException ex) {
83+
// JSR-330 API (as included in Jakarta EE) not available - simply skip.
84+
}
85+
try {
86+
this.qualifierTypes.add((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Qualifier",
87+
QualifierAnnotationAutowireCandidateResolver.class.getClassLoader()));
88+
}
7989
catch (ClassNotFoundException ex) {
8090
// JSR-330 API not available - simply skip.
8191
}
8292
}
8393

8494
/**
85-
* Create a new QualifierAnnotationAutowireCandidateResolver
86-
* for the given qualifier annotation type.
95+
* Create a new {@code QualifierAnnotationAutowireCandidateResolver} for the given
96+
* qualifier annotation type.
8797
* @param qualifierType the qualifier annotation to look for
8898
*/
8999
public QualifierAnnotationAutowireCandidateResolver(Class<? extends Annotation> qualifierType) {
@@ -92,8 +102,8 @@ public QualifierAnnotationAutowireCandidateResolver(Class<? extends Annotation>
92102
}
93103

94104
/**
95-
* Create a new QualifierAnnotationAutowireCandidateResolver
96-
* for the given qualifier annotation types.
105+
* Create a new {@code QualifierAnnotationAutowireCandidateResolver} for the given
106+
* qualifier annotation types.
97107
* @param qualifierTypes the qualifier annotations to look for
98108
*/
99109
public QualifierAnnotationAutowireCandidateResolver(Set<Class<? extends Annotation>> qualifierTypes) {

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,16 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
129129
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
130130

131131
@Nullable
132-
private static Class<?> javaxInjectProviderClass;
132+
private static Class<?> jakartaInjectProviderClass;
133133

134134
static {
135135
try {
136-
javaxInjectProviderClass =
136+
jakartaInjectProviderClass =
137137
ClassUtils.forName("jakarta.inject.Provider", DefaultListableBeanFactory.class.getClassLoader());
138138
}
139139
catch (ClassNotFoundException ex) {
140140
// JSR-330 API not available - Provider interface simply not supported then.
141-
javaxInjectProviderClass = null;
141+
jakartaInjectProviderClass = null;
142142
}
143143
}
144144

@@ -1494,7 +1494,7 @@ else if (ObjectFactory.class == descriptor.getDependencyType() ||
14941494
ObjectProvider.class == descriptor.getDependencyType()) {
14951495
return new DependencyObjectProvider(descriptor, requestingBeanName);
14961496
}
1497-
else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
1497+
else if (jakartaInjectProviderClass == descriptor.getDependencyType()) {
14981498
return new Jsr330Factory().createDependencyProvider(descriptor, requestingBeanName);
14991499
}
15001500
else if (descriptor.supportsLazyResolution()) {

spring-beans/src/test/java/org/springframework/beans/factory/annotation/JakartaAnnotationsRuntimeHintsTests.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 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.
@@ -35,6 +35,7 @@
3535
* Tests for {@link JakartaAnnotationsRuntimeHints}.
3636
*
3737
* @author Brian Clozel
38+
* @author Sam Brannen
3839
*/
3940
class JakartaAnnotationsRuntimeHintsTests {
4041

@@ -62,4 +63,14 @@ void jakartaQualifierAnnotationHasHints() {
6263
assertThat(RuntimeHintsPredicates.reflection().onType(Qualifier.class)).accepts(this.hints);
6364
}
6465

66+
@Test // gh-33345
67+
void javaxInjectAnnotationHasHints() {
68+
assertThat(RuntimeHintsPredicates.reflection().onType(javax.inject.Inject.class)).accepts(this.hints);
69+
}
70+
71+
@Test // gh-33345
72+
void javaxQualifierAnnotationHasHints() {
73+
assertThat(RuntimeHintsPredicates.reflection().onType(javax.inject.Qualifier.class)).accepts(this.hints);
74+
}
75+
6576
}

0 commit comments

Comments
 (0)