Reinstate support for @javax.annotation.ManagedBean & @javax.inject.Named

This commit reinstates support for the legacy JSR-250
@javax.annotation.ManagedBean and JSR-330 @javax.inject.Named
annotations with regard to component name lookups and component
scanning.

Closes gh-31090
This commit is contained in:
Sam Brannen
2023-08-22 13:47:21 +02:00
parent aaa0a2be63
commit e1826d2322
11 changed files with 175 additions and 22 deletions

View File

@@ -24,6 +24,8 @@ import java.lang.annotation.Target;
import example.scannable.DefaultNamedComponent;
import example.scannable.JakartaManagedBeanComponent;
import example.scannable.JakartaNamedComponent;
import example.scannable.JavaxManagedBeanComponent;
import example.scannable.JavaxNamedComponent;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
@@ -90,11 +92,21 @@ class AnnotationBeanNameGeneratorTests {
assertGeneratedName(JakartaNamedComponent.class, "myJakartaNamedComponent");
}
@Test
void generateBeanNameWithJavaxNamedComponent() {
assertGeneratedName(JavaxNamedComponent.class, "myJavaxNamedComponent");
}
@Test
void generateBeanNameWithJakartaManagedBeanComponent() {
assertGeneratedName(JakartaManagedBeanComponent.class, "myJakartaManagedBeanComponent");
}
@Test
void generateBeanNameWithJavaxManagedBeanComponent() {
assertGeneratedName(JavaxManagedBeanComponent.class, "myJavaxManagedBeanComponent");
}
@Test
void generateBeanNameWithCustomStereotypeComponent() {
assertGeneratedName(DefaultNamedComponent.class, "thoreau");

View File

@@ -29,6 +29,8 @@ import java.util.stream.Stream;
import example.gh24375.AnnotatedComponent;
import example.indexed.IndexedJakartaManagedBeanComponent;
import example.indexed.IndexedJakartaNamedComponent;
import example.indexed.IndexedJavaxManagedBeanComponent;
import example.indexed.IndexedJavaxNamedComponent;
import example.profilescan.DevComponent;
import example.profilescan.ProfileAnnotatedComponent;
import example.profilescan.ProfileMetaAnnotatedComponent;
@@ -40,6 +42,8 @@ import example.scannable.FooService;
import example.scannable.FooServiceImpl;
import example.scannable.JakartaManagedBeanComponent;
import example.scannable.JakartaNamedComponent;
import example.scannable.JavaxManagedBeanComponent;
import example.scannable.JavaxNamedComponent;
import example.scannable.MessageBean;
import example.scannable.NamedComponent;
import example.scannable.NamedStubDao;
@@ -100,9 +104,16 @@ class ClassPathScanningCandidateComponentProviderTests {
JakartaManagedBeanComponent.class
);
private static final Set<Class<?>> indexedJakartaComponents = Set.of(
private static final Set<Class<?>> scannedJavaxComponents = Set.of(
JavaxNamedComponent.class,
JavaxManagedBeanComponent.class
);
private static final Set<Class<?>> indexedComponents = Set.of(
IndexedJakartaNamedComponent.class,
IndexedJakartaManagedBeanComponent.class
IndexedJakartaManagedBeanComponent.class,
IndexedJavaxNamedComponent.class,
IndexedJavaxManagedBeanComponent.class
);
@@ -111,25 +122,28 @@ class ClassPathScanningCandidateComponentProviderTests {
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
provider.setResourceLoader(new DefaultResourceLoader(
CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
testDefault(provider, TEST_BASE_PACKAGE, true, false);
testDefault(provider, TEST_BASE_PACKAGE, true, true, false);
}
@Test
void defaultsWithIndex() {
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
provider.setResourceLoader(new DefaultResourceLoader(TEST_BASE_CLASSLOADER));
testDefault(provider, "example", true, true);
testDefault(provider, "example", true, true, true);
}
private void testDefault(ClassPathScanningCandidateComponentProvider provider, String basePackage,
boolean includeScannedJakartaComponents, boolean includeIndexedJakartaComponents) {
boolean includeScannedJakartaComponents, boolean includeScannedJavaxComponents, boolean includeIndexedComponents) {
Set<Class<?>> expectedTypes = new HashSet<>(springComponents);
if (includeScannedJakartaComponents) {
expectedTypes.addAll(scannedJakartaComponents);
}
if (includeIndexedJakartaComponents) {
expectedTypes.addAll(indexedJakartaComponents);
if (includeScannedJavaxComponents) {
expectedTypes.addAll(scannedJavaxComponents);
}
if (includeIndexedComponents) {
expectedTypes.addAll(indexedComponents);
}
Set<BeanDefinition> candidates = provider.findCandidateComponents(basePackage);
@@ -202,7 +216,7 @@ class ClassPathScanningCandidateComponentProviderTests {
private void testCustomAnnotationTypeIncludeFilter(ClassPathScanningCandidateComponentProvider provider) {
provider.addIncludeFilter(new AnnotationTypeFilter(Component.class));
testDefault(provider, TEST_BASE_PACKAGE, false, false);
testDefault(provider, TEST_BASE_PACKAGE, false, false, false);
}
@Test
@@ -295,7 +309,7 @@ class ClassPathScanningCandidateComponentProviderTests {
Set<BeanDefinition> candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
assertScannedBeanDefinitions(candidates);
assertBeanTypes(candidates, FooServiceImpl.class, StubFooDao.class, ServiceInvocationCounter.class,
BarComponent.class, JakartaManagedBeanComponent.class);
BarComponent.class, JakartaManagedBeanComponent.class, JavaxManagedBeanComponent.class);
}
@Test