Allow target to be a ClassName rather than an existing Class
See gh-29207
This commit is contained in:
parent
8ef850ff91
commit
e6aef11b09
|
|
@ -37,6 +37,7 @@ import org.springframework.beans.factory.support.InstanceSupplier;
|
||||||
import org.springframework.beans.factory.support.RegisteredBean;
|
import org.springframework.beans.factory.support.RegisteredBean;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.javapoet.ClassName;
|
||||||
import org.springframework.javapoet.CodeBlock;
|
import org.springframework.javapoet.CodeBlock;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
|
|
@ -108,8 +109,8 @@ class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProc
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
|
public ClassName getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
|
||||||
return this.targetBeanDefinition.getResolvableType().toClass();
|
return ClassName.get(this.targetBeanDefinition.getResolvableType().toClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -94,9 +94,9 @@ class BeanDefinitionMethodGenerator {
|
||||||
registerRuntimeHintsIfNecessary(generationContext.getRuntimeHints());
|
registerRuntimeHintsIfNecessary(generationContext.getRuntimeHints());
|
||||||
BeanRegistrationCodeFragments codeFragments = getCodeFragments(generationContext,
|
BeanRegistrationCodeFragments codeFragments = getCodeFragments(generationContext,
|
||||||
beanRegistrationsCode);
|
beanRegistrationsCode);
|
||||||
Class<?> target = codeFragments.getTarget(this.registeredBean,
|
ClassName target = codeFragments.getTarget(this.registeredBean,
|
||||||
this.constructorOrFactoryMethod);
|
this.constructorOrFactoryMethod);
|
||||||
if (!target.getName().startsWith("java.")) {
|
if (!target.canonicalName().startsWith("java.")) {
|
||||||
GeneratedClass generatedClass = generationContext.getGeneratedClasses()
|
GeneratedClass generatedClass = generationContext.getGeneratedClasses()
|
||||||
.getOrAddForFeatureComponent("BeanDefinitions", target, type -> {
|
.getOrAddForFeatureComponent("BeanDefinitions", target, type -> {
|
||||||
type.addJavadoc("Bean definitions for {@link $T}", target);
|
type.addJavadoc("Bean definitions for {@link $T}", target);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import org.springframework.beans.factory.support.InstanceSupplier;
|
||||||
import org.springframework.beans.factory.support.RegisteredBean;
|
import org.springframework.beans.factory.support.RegisteredBean;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.javapoet.ClassName;
|
||||||
import org.springframework.javapoet.CodeBlock;
|
import org.springframework.javapoet.CodeBlock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -52,9 +53,9 @@ public interface BeanRegistrationCodeFragments {
|
||||||
* the code.
|
* the code.
|
||||||
* @param registeredBean the registered bean
|
* @param registeredBean the registered bean
|
||||||
* @param constructorOrFactoryMethod the constructor or factory method
|
* @param constructorOrFactoryMethod the constructor or factory method
|
||||||
* @return the target class
|
* @return the target {@link ClassName}
|
||||||
*/
|
*/
|
||||||
Class<?> getTarget(RegisteredBean registeredBean,
|
ClassName getTarget(RegisteredBean registeredBean,
|
||||||
Executable constructorOrFactoryMethod);
|
Executable constructorOrFactoryMethod);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import org.springframework.aot.generate.MethodReference;
|
||||||
import org.springframework.beans.factory.support.RegisteredBean;
|
import org.springframework.beans.factory.support.RegisteredBean;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.javapoet.ClassName;
|
||||||
import org.springframework.javapoet.CodeBlock;
|
import org.springframework.javapoet.CodeBlock;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
|
@ -51,7 +52,7 @@ public class BeanRegistrationCodeFragmentsDecorator implements BeanRegistrationC
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getTarget(RegisteredBean registeredBean,
|
public ClassName getTarget(RegisteredBean registeredBean,
|
||||||
Executable constructorOrFactoryMethod) {
|
Executable constructorOrFactoryMethod) {
|
||||||
|
|
||||||
return this.delegate.getTarget(registeredBean, constructorOrFactoryMethod);
|
return this.delegate.getTarget(registeredBean, constructorOrFactoryMethod);
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import org.springframework.beans.factory.support.InstanceSupplier;
|
||||||
import org.springframework.beans.factory.support.RegisteredBean;
|
import org.springframework.beans.factory.support.RegisteredBean;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.javapoet.ClassName;
|
||||||
import org.springframework.javapoet.CodeBlock;
|
import org.springframework.javapoet.CodeBlock;
|
||||||
import org.springframework.javapoet.ParameterizedTypeName;
|
import org.springframework.javapoet.ParameterizedTypeName;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
@ -70,7 +71,7 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getTarget(RegisteredBean registeredBean,
|
public ClassName getTarget(RegisteredBean registeredBean,
|
||||||
Executable constructorOrFactoryMethod) {
|
Executable constructorOrFactoryMethod) {
|
||||||
|
|
||||||
Class<?> target = extractDeclaringClass(registeredBean.getBeanType(), constructorOrFactoryMethod);
|
Class<?> target = extractDeclaringClass(registeredBean.getBeanType(), constructorOrFactoryMethod);
|
||||||
|
|
@ -79,7 +80,7 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
|
||||||
Assert.state(parent != null, "No parent available for inner bean");
|
Assert.state(parent != null, "No parent available for inner bean");
|
||||||
target = parent.getBeanClass();
|
target = parent.getBeanClass();
|
||||||
}
|
}
|
||||||
return target;
|
return ClassName.get(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Class<?> extractDeclaringClass(ResolvableType beanType, Executable executable) {
|
private Class<?> extractDeclaringClass(ResolvableType beanType, Executable executable) {
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ import org.springframework.beans.testfixture.beans.factory.aot.SimpleBean;
|
||||||
import org.springframework.beans.testfixture.beans.factory.aot.SimpleBeanConfiguration;
|
import org.springframework.beans.testfixture.beans.factory.aot.SimpleBeanConfiguration;
|
||||||
import org.springframework.beans.testfixture.beans.factory.aot.SimpleBeanFactoryBean;
|
import org.springframework.beans.testfixture.beans.factory.aot.SimpleBeanFactoryBean;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.javapoet.ClassName;
|
||||||
import org.springframework.util.ReflectionUtils;
|
import org.springframework.util.ReflectionUtils;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
@ -52,45 +53,45 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructor() {
|
void getTargetOnConstructor() {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
|
||||||
SimpleBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
SimpleBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructorToPublicFactoryBean() {
|
void getTargetOnConstructorToPublicFactoryBean() {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
|
||||||
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructorToPublicGenericFactoryBeanExtractTargetFromFactoryBeanType() {
|
void getTargetOnConstructorToPublicGenericFactoryBeanExtractTargetFromFactoryBeanType() {
|
||||||
RegisteredBean registeredBean = registerTestBean(ResolvableType
|
RegisteredBean registeredBean = registerTestBean(ResolvableType
|
||||||
.forClassWithGenerics(GenericFactoryBean.class, SimpleBean.class));
|
.forClassWithGenerics(GenericFactoryBean.class, SimpleBean.class));
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
|
||||||
GenericFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
GenericFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructorToPublicGenericFactoryBeanWithBoundExtractTargetFromFactoryBeanType() {
|
void getTargetOnConstructorToPublicGenericFactoryBeanWithBoundExtractTargetFromFactoryBeanType() {
|
||||||
RegisteredBean registeredBean = registerTestBean(ResolvableType
|
RegisteredBean registeredBean = registerTestBean(ResolvableType
|
||||||
.forClassWithGenerics(NumberFactoryBean.class, Integer.class));
|
.forClassWithGenerics(NumberFactoryBean.class, Integer.class));
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
|
||||||
NumberFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(Integer.class);
|
NumberFactoryBean.class.getDeclaredConstructors()[0]), Integer.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructorToPublicGenericFactoryBeanUseBeanTypeAsFallback() {
|
void getTargetOnConstructorToPublicGenericFactoryBeanUseBeanTypeAsFallback() {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
|
||||||
GenericFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
GenericFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructorToProtectedFactoryBean() {
|
void getTargetOnConstructorToProtectedFactoryBean() {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean,
|
||||||
PrivilegedTestBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(
|
PrivilegedTestBeanFactoryBean.class.getDeclaredConstructors()[0]),
|
||||||
PrivilegedTestBeanFactoryBean.class);
|
PrivilegedTestBeanFactoryBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,8 +100,8 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
Method method = ReflectionUtils.findMethod(SimpleBeanConfiguration.class, "simpleBean");
|
Method method = ReflectionUtils.findMethod(SimpleBeanConfiguration.class, "simpleBean");
|
||||||
assertThat(method).isNotNull();
|
assertThat(method).isNotNull();
|
||||||
assertThat(createInstance(registeredBean).getTarget(registeredBean,
|
assertTarget(createInstance(registeredBean).getTarget(registeredBean, method),
|
||||||
method)).isEqualTo(SimpleBeanConfiguration.class);
|
SimpleBeanConfiguration.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -110,16 +111,15 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
new RootBeanDefinition(String.class));
|
new RootBeanDefinition(String.class));
|
||||||
Method method = ReflectionUtils.findMethod(getClass(), "createString");
|
Method method = ReflectionUtils.findMethod(getClass(), "createString");
|
||||||
assertThat(method).isNotNull();
|
assertThat(method).isNotNull();
|
||||||
assertThat(createInstance(innerBean).getTarget(innerBean,
|
assertTarget(createInstance(innerBean).getTarget(innerBean, method), getClass());
|
||||||
method)).isEqualTo(getClass());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getTargetOnConstructorWithInnerBeanInJavaPackage() {
|
void getTargetOnConstructorWithInnerBeanInJavaPackage() {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean", new RootBeanDefinition(String.class));
|
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean", new RootBeanDefinition(String.class));
|
||||||
assertThat(createInstance(innerBean).getTarget(innerBean,
|
assertTarget(createInstance(innerBean).getTarget(innerBean,
|
||||||
String.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
String.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -127,8 +127,8 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
|
||||||
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
|
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
|
||||||
new RootBeanDefinition(StringFactoryBean.class));
|
new RootBeanDefinition(StringFactoryBean.class));
|
||||||
assertThat(createInstance(innerBean).getTarget(innerBean,
|
assertTarget(createInstance(innerBean).getTarget(innerBean,
|
||||||
StringFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
StringFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -138,8 +138,8 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
new RootBeanDefinition(SimpleBean.class));
|
new RootBeanDefinition(SimpleBean.class));
|
||||||
Method method = ReflectionUtils.findMethod(SimpleBeanConfiguration.class, "simpleBean");
|
Method method = ReflectionUtils.findMethod(SimpleBeanConfiguration.class, "simpleBean");
|
||||||
assertThat(method).isNotNull();
|
assertThat(method).isNotNull();
|
||||||
assertThat(createInstance(innerBean).getTarget(innerBean, method))
|
assertTarget(createInstance(innerBean).getTarget(innerBean, method),
|
||||||
.isEqualTo(SimpleBeanConfiguration.class);
|
SimpleBeanConfiguration.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -147,8 +147,8 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
RegisteredBean registeredBean = registerTestBean(DummyFactory.class);
|
RegisteredBean registeredBean = registerTestBean(DummyFactory.class);
|
||||||
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
|
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
|
||||||
new RootBeanDefinition(SimpleBean.class));
|
new RootBeanDefinition(SimpleBean.class));
|
||||||
assertThat(createInstance(innerBean).getTarget(innerBean,
|
assertTarget(createInstance(innerBean).getTarget(innerBean,
|
||||||
SimpleBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
SimpleBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -156,8 +156,12 @@ class DefaultBeanRegistrationCodeFragmentsTests {
|
||||||
RegisteredBean registeredBean = registerTestBean(DummyFactory.class);
|
RegisteredBean registeredBean = registerTestBean(DummyFactory.class);
|
||||||
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
|
RegisteredBean innerBean = RegisteredBean.ofInnerBean(registeredBean, "innerTestBean",
|
||||||
new RootBeanDefinition(SimpleBean.class));
|
new RootBeanDefinition(SimpleBean.class));
|
||||||
assertThat(createInstance(innerBean).getTarget(innerBean,
|
assertTarget(createInstance(innerBean).getTarget(innerBean,
|
||||||
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(SimpleBean.class);
|
SimpleBeanFactoryBean.class.getDeclaredConstructors()[0]), SimpleBean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertTarget(ClassName target, Class<?> expected) {
|
||||||
|
assertThat(target).isEqualTo(ClassName.get(expected));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue