Skip to content

Commit e6aef11

Browse files
committed
Allow target to be a ClassName rather than an existing Class
See gh-29207
1 parent 8ef850f commit e6aef11

File tree

6 files changed

+43
-35
lines changed

6 files changed

+43
-35
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/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

0 commit comments

Comments
 (0)