Skip to content

Commit dd3e3b2

Browse files
committed
Merge branch 'gh-29207'
Closes gh-29207
2 parents 1707a22 + e6aef11 commit dd3e3b2

File tree

15 files changed

+142
-116
lines changed

15 files changed

+142
-116
lines changed

spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyBeanRegistrationAotProcessor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.beans.factory.support.RegisteredBean;
3838
import org.springframework.beans.factory.support.RootBeanDefinition;
3939
import org.springframework.core.ResolvableType;
40+
import org.springframework.javapoet.ClassName;
4041
import org.springframework.javapoet.CodeBlock;
4142
import org.springframework.lang.Nullable;
4243

@@ -108,8 +109,8 @@ private static class ScopedProxyBeanRegistrationCodeFragments extends BeanRegist
108109
}
109110

110111
@Override
111-
public Class<?> getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
112-
return this.targetBeanDefinition.getResolvableType().toClass();
112+
public ClassName getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
113+
return ClassName.get(this.targetBeanDefinition.getResolvableType().toClass());
113114
}
114115

115116
@Override

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ MethodReference generateBeanDefinitionMethod(GenerationContext generationContext
9494
registerRuntimeHintsIfNecessary(generationContext.getRuntimeHints());
9595
BeanRegistrationCodeFragments codeFragments = getCodeFragments(generationContext,
9696
beanRegistrationsCode);
97-
Class<?> target = codeFragments.getTarget(this.registeredBean,
97+
ClassName target = codeFragments.getTarget(this.registeredBean,
9898
this.constructorOrFactoryMethod);
99-
if (!target.getName().startsWith("java.")) {
99+
if (!target.canonicalName().startsWith("java.")) {
100100
GeneratedClass generatedClass = generationContext.getGeneratedClasses()
101101
.getOrAddForFeatureComponent("BeanDefinitions", target, type -> {
102102
type.addJavadoc("Bean definitions for {@link $T}", target);

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationCodeFragments.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.beans.factory.support.RegisteredBean;
2727
import org.springframework.beans.factory.support.RootBeanDefinition;
2828
import org.springframework.core.ResolvableType;
29+
import org.springframework.javapoet.ClassName;
2930
import org.springframework.javapoet.CodeBlock;
3031

3132
/**
@@ -52,9 +53,9 @@ public interface BeanRegistrationCodeFragments {
5253
* the code.
5354
* @param registeredBean the registered bean
5455
* @param constructorOrFactoryMethod the constructor or factory method
55-
* @return the target class
56+
* @return the target {@link ClassName}
5657
*/
57-
Class<?> getTarget(RegisteredBean registeredBean,
58+
ClassName getTarget(RegisteredBean registeredBean,
5859
Executable constructorOrFactoryMethod);
5960

6061
/**

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationCodeFragmentsDecorator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.beans.factory.support.RegisteredBean;
2727
import org.springframework.beans.factory.support.RootBeanDefinition;
2828
import org.springframework.core.ResolvableType;
29+
import org.springframework.javapoet.ClassName;
2930
import org.springframework.javapoet.CodeBlock;
3031
import org.springframework.util.Assert;
3132

@@ -51,7 +52,7 @@ protected BeanRegistrationCodeFragmentsDecorator(BeanRegistrationCodeFragments d
5152
}
5253

5354
@Override
54-
public Class<?> getTarget(RegisteredBean registeredBean,
55+
public ClassName getTarget(RegisteredBean registeredBean,
5556
Executable constructorOrFactoryMethod) {
5657

5758
return this.delegate.getTarget(registeredBean, constructorOrFactoryMethod);

spring-beans/src/main/java/org/springframework/beans/factory/aot/DefaultBeanRegistrationCodeFragments.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.beans.factory.support.RegisteredBean;
3333
import org.springframework.beans.factory.support.RootBeanDefinition;
3434
import org.springframework.core.ResolvableType;
35+
import org.springframework.javapoet.ClassName;
3536
import org.springframework.javapoet.CodeBlock;
3637
import org.springframework.javapoet.ParameterizedTypeName;
3738
import org.springframework.lang.Nullable;
@@ -70,7 +71,7 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
7071

7172

7273
@Override
73-
public Class<?> getTarget(RegisteredBean registeredBean,
74+
public ClassName getTarget(RegisteredBean registeredBean,
7475
Executable constructorOrFactoryMethod) {
7576

7677
Class<?> target = extractDeclaringClass(registeredBean.getBeanType(), constructorOrFactoryMethod);
@@ -79,7 +80,7 @@ public Class<?> getTarget(RegisteredBean registeredBean,
7980
Assert.state(parent != null, "No parent available for inner bean");
8081
target = parent.getBeanClass();
8182
}
82-
return target;
83+
return ClassName.get(target);
8384
}
8485

8586
private Class<?> extractDeclaringClass(ResolvableType beanType, Executable executable) {

spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanRegistrationsAotContributionTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.aot.generate.MethodReference;
3434
import org.springframework.aot.generate.MethodReference.ArgumentCodeGenerator;
3535
import org.springframework.aot.test.generate.TestGenerationContext;
36-
import org.springframework.aot.test.generate.TestTarget;
3736
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
3837
import org.springframework.beans.factory.support.RegisteredBean;
3938
import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -97,7 +96,7 @@ void applyToAppliesContribution() {
9796
@Test
9897
void applyToWhenHasNameGeneratesPrefixedFeatureName() {
9998
this.generationContext = new TestGenerationContext(
100-
new ClassNameGenerator(TestTarget.class, "Management"));
99+
new ClassNameGenerator(TestGenerationContext.TEST_TARGET, "Management"));
101100
this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext);
102101
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();
103102
RegisteredBean registeredBean = registerBean(

spring-beans/src/test/java/org/springframework/beans/factory/aot/DefaultBeanRegistrationCodeFragmentsTests.java

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.beans.testfixture.beans.factory.aot.SimpleBeanConfiguration;
3535
import org.springframework.beans.testfixture.beans.factory.aot.SimpleBeanFactoryBean;
3636
import org.springframework.core.ResolvableType;
37+
import org.springframework.javapoet.ClassName;
3738
import org.springframework.util.ReflectionUtils;
3839

3940
import static org.assertj.core.api.Assertions.assertThat;
@@ -52,45 +53,45 @@ class DefaultBeanRegistrationCodeFragmentsTests {
5253
@Test
5354
void getTargetOnConstructor() {
5455
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
55-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
56-
SimpleBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
56+
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
57+
SimpleBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
5758
}
5859

5960
@Test
6061
void getTargetOnConstructorToPublicFactoryBean() {
6162
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
62-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
63-
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
63+
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
64+
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
6465
}
6566

6667
@Test
6768
void getTargetOnConstructorToPublicGenericFactoryBeanExtractTargetFromFactoryBeanType() {
6869
RegisteredBean registeredBean = registerTestBean(ResolvableType
6970
.forClassWithGenerics(GenericFactoryBean.class, SimpleBean.class));
70-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
71-
GenericFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
71+
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
72+
GenericFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
7273
}
7374

7475
@Test
7576
void getTargetOnConstructorToPublicGenericFactoryBeanWithBoundExtractTargetFromFactoryBeanType() {
7677
RegisteredBean registeredBean = registerTestBean(ResolvableType
7778
.forClassWithGenerics(NumberFactoryBean.class, Integer.class));
78-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
79-
NumberFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(Integer.class);
79+
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
80+
NumberFactoryBean.class.getDeclaredConstructors()[0]), Integer.class);
8081
}
8182

8283
@Test
8384
void getTargetOnConstructorToPublicGenericFactoryBeanUseBeanTypeAsFallback() {
8485
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
85-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
86-
GenericFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
86+
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
87+
GenericFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
8788
}
8889

8990
@Test
9091
void getTargetOnConstructorToProtectedFactoryBean() {
9192
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
92-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
93-
PrivilegedTestBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(
93+
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
94+
PrivilegedTestBeanFactoryBean.class.getDeclaredConstructors()[0]),
9495
PrivilegedTestBeanFactoryBean.class);
9596
}
9697

@@ -99,8 +100,8 @@ void getTargetOnMethod() {
99100
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
100101
Method method = ReflectionUtils.findMethod(SimpleBeanConfiguration.class, "simpleBean");
101102
assertThat(method).isNotNull();
102-
assertThat(createInstance(registeredBean).getTarget(registeredBean,
103-
method)).isEqualTo(SimpleBeanConfiguration.class);
103+
assertTarget(createInstance(registeredBean).getTarget(registeredBean, method),
104+
SimpleBeanConfiguration.class);
104105
}
105106

106107
@Test
@@ -110,25 +111,24 @@ void getTargetOnMethodWithInnerBeanInJavaPackage() {
110111
new RootBeanDefinition(String.class));
111112
Method method = ReflectionUtils.findMethod(getClass(), "createString");
112113
assertThat(method).isNotNull();
113-
assertThat(createInstance(innerBean).getTarget(innerBean,
114-
method)).isEqualTo(getClass());
114+
assertTarget(createInstance(innerBean).getTarget(innerBean, method), getClass());
115115
}
116116

117117
@Test
118118
void getTargetOnConstructorWithInnerBeanInJavaPackage() {
119119
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
120120
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean", new RootBeanDefinition(String.class));
121-
assertThat(createInstance(innerBean).getTarget(innerBean,
122-
String.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
121+
assertTarget(createInstance(innerBean).getTarget(innerBean,
122+
String.class.getDeclaredConstructors()[0]), SimpleBean.class);
123123
}
124124

125125
@Test
126126
void getTargetOnConstructorWithInnerBeanOnTypeInJavaPackage() {
127127
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
128128
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
129129
new RootBeanDefinition(StringFactoryBean.class));
130-
assertThat(createInstance(innerBean).getTarget(innerBean,
131-
StringFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
130+
assertTarget(createInstance(innerBean).getTarget(innerBean,
131+
StringFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
132132
}
133133

134134
@Test
@@ -138,26 +138,30 @@ void getTargetOnMethodWithInnerBeanInRegularPackage() {
138138
new RootBeanDefinition(SimpleBean.class));
139139
Method method = ReflectionUtils.findMethod(SimpleBeanConfiguration.class, "simpleBean");
140140
assertThat(method).isNotNull();
141-
assertThat(createInstance(innerBean).getTarget(innerBean, method))
142-
.isEqualTo(SimpleBeanConfiguration.class);
141+
assertTarget(createInstance(innerBean).getTarget(innerBean, method),
142+
SimpleBeanConfiguration.class);
143143
}
144144

145145
@Test
146146
void getTargetOnConstructorWithInnerBeanInRegularPackage() {
147147
RegisteredBean registeredBean = registerTestBean(DummyFactory.class);
148148
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
149149
new RootBeanDefinition(SimpleBean.class));
150-
assertThat(createInstance(innerBean).getTarget(innerBean,
151-
SimpleBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
150+
assertTarget(createInstance(innerBean).getTarget(innerBean,
151+
SimpleBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
152152
}
153153

154154
@Test
155155
void getTargetOnConstructorWithInnerBeanOnFactoryBeanOnTypeInRegularPackage() {
156156
RegisteredBean registeredBean = registerTestBean(DummyFactory.class);
157157
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
158158
new RootBeanDefinition(SimpleBean.class));
159-
assertThat(createInstance(innerBean).getTarget(innerBean,
160-
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
159+
assertTarget(createInstance(innerBean).getTarget(innerBean,
160+
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
161+
}
162+
163+
private void assertTarget(ClassName target, Class<?> expected) {
164+
assertThat(target).isEqualTo(ClassName.get(expected));
161165
}
162166

163167

spring-core-test/src/main/java/org/springframework/aot/test/generate/TestGenerationContext.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.aot.generate.GenerationContext;
2424
import org.springframework.aot.generate.InMemoryGeneratedFiles;
2525
import org.springframework.core.test.tools.TestCompiler;
26+
import org.springframework.javapoet.ClassName;
2627

2728
/**
2829
* {@link GenerationContext} test implementation that uses
@@ -35,6 +36,11 @@
3536
*/
3637
public class TestGenerationContext extends DefaultGenerationContext implements UnaryOperator<TestCompiler> {
3738

39+
/**
40+
* The default test target {@link ClassName}.
41+
*/
42+
public static final ClassName TEST_TARGET = ClassName.get("com.example", "TestTarget");
43+
3844
/**
3945
* Create an instance using the specified {@link ClassNameGenerator}.
4046
* @param classNameGenerator the class name generator to use
@@ -47,15 +53,15 @@ public TestGenerationContext(ClassNameGenerator classNameGenerator) {
4753
* Create an instance using the specified {@code target}.
4854
* @param target the default target class to use
4955
*/
50-
public TestGenerationContext(Class<?> target) {
56+
public TestGenerationContext(ClassName target) {
5157
this(new ClassNameGenerator(target));
5258
}
5359

5460
/**
55-
* Create an instance using {@link TestTarget} as the {@code target}.
61+
* Create an instance using {@link #TEST_TARGET} as the {@code target}.
5662
*/
5763
public TestGenerationContext() {
58-
this(TestTarget.class);
64+
this(TEST_TARGET);
5965
}
6066

6167

spring-core-test/src/main/java/org/springframework/aot/test/generate/TestTarget.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

spring-core/src/main/java/org/springframework/aot/generate/ClassNameGenerator.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import org.springframework.util.StringUtils;
2828

2929
/**
30-
* Generate unique class names based on a target {@link Class} and a feature
31-
* name.
30+
* Generate unique class names based on a target {@link ClassName} and a
31+
* feature name.
3232
*
3333
* <p>This class is stateful, so the same instance should be used for all name
3434
* generation.
@@ -43,7 +43,7 @@ public final class ClassNameGenerator {
4343

4444
private static final String AOT_FEATURE = "Aot";
4545

46-
private final Class<?> defaultTarget;
46+
private final ClassName defaultTarget;
4747

4848
private final String featureNamePrefix;
4949

@@ -55,7 +55,7 @@ public final class ClassNameGenerator {
5555
* feature name prefix.
5656
* @param defaultTarget the default target class to use
5757
*/
58-
public ClassNameGenerator(Class<?> defaultTarget) {
58+
public ClassNameGenerator(ClassName defaultTarget) {
5959
this(defaultTarget, "");
6060
}
6161

@@ -65,11 +65,11 @@ public ClassNameGenerator(Class<?> defaultTarget) {
6565
* @param defaultTarget the default target class to use
6666
* @param featureNamePrefix the prefix to use to qualify feature names
6767
*/
68-
public ClassNameGenerator(Class<?> defaultTarget, String featureNamePrefix) {
68+
public ClassNameGenerator(ClassName defaultTarget, String featureNamePrefix) {
6969
this(defaultTarget, featureNamePrefix, new ConcurrentHashMap<>());
7070
}
7171

72-
private ClassNameGenerator(Class<?> defaultTarget, String featureNamePrefix,
72+
private ClassNameGenerator(ClassName defaultTarget, String featureNamePrefix,
7373
Map<String, AtomicInteger> sequenceGenerator) {
7474
Assert.notNull(defaultTarget, "'defaultTarget' must not be null");
7575
this.defaultTarget = defaultTarget;
@@ -98,16 +98,16 @@ String getFeatureNamePrefix() {
9898
* {@code null} to use the main target
9999
* @return a unique generated class name
100100
*/
101-
public ClassName generateClassName(String featureName, @Nullable Class<?> target) {
101+
public ClassName generateClassName(String featureName, @Nullable ClassName target) {
102102
return generateSequencedClassName(getRootName(featureName, target));
103103
}
104104

105-
private String getRootName(String featureName, @Nullable Class<?> target) {
105+
private String getRootName(String featureName, @Nullable ClassName target) {
106106
Assert.hasLength(featureName, "'featureName' must not be empty");
107107
featureName = clean(featureName);
108-
Class<?> targetToUse = (target != null ? target : this.defaultTarget);
108+
ClassName targetToUse = (target != null ? target : this.defaultTarget);
109109
String featureNameToUse = this.featureNamePrefix + featureName;
110-
return targetToUse.getName().replace("$", "_") + SEPARATOR + StringUtils.capitalize(featureNameToUse);
110+
return toName(targetToUse).replace("$", "_") + SEPARATOR + StringUtils.capitalize(featureNameToUse);
111111
}
112112

113113
private String clean(String name) {
@@ -147,4 +147,8 @@ ClassNameGenerator withFeatureNamePrefix(String featureNamePrefix) {
147147
this.sequenceGenerator);
148148
}
149149

150+
private static String toName(ClassName className) {
151+
return GeneratedTypeReference.of(className).getName();
152+
}
153+
150154
}

0 commit comments

Comments
 (0)