Polishing

This commit is contained in:
Juergen Hoeller 2022-08-10 23:30:27 +02:00
parent b31a15851e
commit 38c9e7f629
12 changed files with 47 additions and 66 deletions

View File

@ -46,24 +46,21 @@ import org.springframework.lang.Nullable;
* @author Phillip Webb * @author Phillip Webb
* @since 6.0 * @since 6.0
*/ */
class ScopedProxyBeanRegistrationAotProcessor class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
implements BeanRegistrationAotProcessor {
private static final Log logger = LogFactory private static final Log logger = LogFactory.getLog(ScopedProxyBeanRegistrationAotProcessor.class);
.getLog(ScopedProxyBeanRegistrationAotProcessor.class);
@Override @Override
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) { public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
Class<?> beanType = registeredBean.getBeanType().toClass(); Class<?> beanType = registeredBean.getBeanType().toClass();
if (beanType.equals(ScopedProxyFactoryBean.class)) { if (beanType.equals(ScopedProxyFactoryBean.class)) {
String targetBeanName = getTargetBeanName( String targetBeanName = getTargetBeanName(registeredBean.getMergedBeanDefinition());
registeredBean.getMergedBeanDefinition()); BeanDefinition targetBeanDefinition =
BeanDefinition targetBeanDefinition = getTargetBeanDefinition( getTargetBeanDefinition(registeredBean.getBeanFactory(), targetBeanName);
registeredBean.getBeanFactory(), targetBeanName);
if (targetBeanDefinition == null) { if (targetBeanDefinition == null) {
logger.warn("Could not handle " + ScopedProxyFactoryBean.class.getSimpleName() logger.warn("Could not handle " + ScopedProxyFactoryBean.class.getSimpleName() +
+ ": no target bean definition found with name " + targetBeanName); ": no target bean definition found with name " + targetBeanName);
return null; return null;
} }
return BeanRegistrationAotContribution.ofBeanRegistrationCodeFragmentsCustomizer(codeFragments -> return BeanRegistrationAotContribution.ofBeanRegistrationCodeFragmentsCustomizer(codeFragments ->
@ -76,7 +73,7 @@ class ScopedProxyBeanRegistrationAotProcessor
@Nullable @Nullable
private String getTargetBeanName(BeanDefinition beanDefinition) { private String getTargetBeanName(BeanDefinition beanDefinition) {
Object value = beanDefinition.getPropertyValues().get("targetBeanName"); Object value = beanDefinition.getPropertyValues().get("targetBeanName");
return (value instanceof String) ? (String) value : null; return (value instanceof String ? (String) value : null);
} }
@Nullable @Nullable
@ -90,23 +87,18 @@ class ScopedProxyBeanRegistrationAotProcessor
} }
private static class ScopedProxyBeanRegistrationCodeFragments private static class ScopedProxyBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments {
extends BeanRegistrationCodeFragments {
private static final String REGISTERED_BEAN_PARAMETER_NAME = "registeredBean"; private static final String REGISTERED_BEAN_PARAMETER_NAME = "registeredBean";
private final RegisteredBean registeredBean; private final RegisteredBean registeredBean;
private final String targetBeanName; private final String targetBeanName;
private final BeanDefinition targetBeanDefinition; private final BeanDefinition targetBeanDefinition;
ScopedProxyBeanRegistrationCodeFragments(BeanRegistrationCodeFragments codeGenerator,
ScopedProxyBeanRegistrationCodeFragments( RegisteredBean registeredBean, String targetBeanName, BeanDefinition targetBeanDefinition) {
BeanRegistrationCodeFragments codeGenerator,
RegisteredBean registeredBean, String targetBeanName,
BeanDefinition targetBeanDefinition) {
super(codeGenerator); super(codeGenerator);
this.registeredBean = registeredBean; this.registeredBean = registeredBean;
@ -114,17 +106,14 @@ class ScopedProxyBeanRegistrationAotProcessor
this.targetBeanDefinition = targetBeanDefinition; this.targetBeanDefinition = targetBeanDefinition;
} }
@Override @Override
public Class<?> getTarget(RegisteredBean registeredBean, public Class<?> getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
Executable constructorOrFactoryMethod) {
return this.targetBeanDefinition.getResolvableType().toClass(); return this.targetBeanDefinition.getResolvableType().toClass();
} }
@Override @Override
public CodeBlock generateNewBeanDefinitionCode( public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
GenerationContext generationContext, ResolvableType beanType, ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
BeanRegistrationCode beanRegistrationCode) {
return super.generateNewBeanDefinitionCode(generationContext, return super.generateNewBeanDefinitionCode(generationContext,
this.targetBeanDefinition.getResolvableType(), beanRegistrationCode); this.targetBeanDefinition.getResolvableType(), beanRegistrationCode);

View File

@ -180,8 +180,8 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB
private String[] safeMerge(@Nullable String[] existingNames, Collection<LifecycleElement> detectedElements) { private String[] safeMerge(@Nullable String[] existingNames, Collection<LifecycleElement> detectedElements) {
Stream<String> detectedNames = detectedElements.stream().map(LifecycleElement::getIdentifier); Stream<String> detectedNames = detectedElements.stream().map(LifecycleElement::getIdentifier);
Stream<String> mergedNames = (existingNames != null Stream<String> mergedNames = (existingNames != null ?
? Stream.concat(Stream.of(existingNames), detectedNames) : detectedNames); Stream.concat(Stream.of(existingNames), detectedNames) : detectedNames);
return mergedNames.distinct().toArray(String[]::new); return mergedNames.distinct().toArray(String[]::new);
} }

View File

@ -55,7 +55,6 @@ public interface BeanFactoryInitializationAotProcessor {
* @return a {@link BeanFactoryInitializationAotContribution} or {@code null} * @return a {@link BeanFactoryInitializationAotContribution} or {@code null}
*/ */
@Nullable @Nullable
BeanFactoryInitializationAotContribution processAheadOfTime( BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory);
ConfigurableListableBeanFactory beanFactory);
} }

View File

@ -103,9 +103,8 @@ public abstract class BeanRegistrationCodeFragments {
* @return the generated code * @return the generated code
*/ */
public CodeBlock generateSetBeanDefinitionPropertiesCode( public CodeBlock generateSetBeanDefinitionPropertiesCode(
GenerationContext generationContext, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition, RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
Predicate<String> attributeFilter) {
return this.codeFragments.generateSetBeanDefinitionPropertiesCode( return this.codeFragments.generateSetBeanDefinitionPropertiesCode(
generationContext, beanRegistrationCode, beanDefinition, attributeFilter); generationContext, beanRegistrationCode, beanDefinition, attributeFilter);
@ -122,9 +121,8 @@ public abstract class BeanRegistrationCodeFragments {
* @see #generateInstanceSupplierCode * @see #generateInstanceSupplierCode
*/ */
public CodeBlock generateSetBeanInstanceSupplierCode( public CodeBlock generateSetBeanInstanceSupplierCode(
GenerationContext generationContext, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode, CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {
List<MethodReference> postProcessors) {
return this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext, return this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext,
beanRegistrationCode, instanceSupplierCode, postProcessors); beanRegistrationCode, instanceSupplierCode, postProcessors);
@ -140,13 +138,12 @@ public abstract class BeanRegistrationCodeFragments {
* than always needing an {@link InstanceSupplier} * than always needing an {@link InstanceSupplier}
* @return the generated code * @return the generated code
*/ */
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext, public CodeBlock generateInstanceSupplierCode(
BeanRegistrationCode beanRegistrationCode, GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) { Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
return this.codeFragments.generateInstanceSupplierCode(generationContext, return this.codeFragments.generateInstanceSupplierCode(generationContext,
beanRegistrationCode, constructorOrFactoryMethod, beanRegistrationCode, constructorOrFactoryMethod, allowDirectSupplierShortcut);
allowDirectSupplierShortcut);
} }
/** /**
@ -155,11 +152,10 @@ public abstract class BeanRegistrationCodeFragments {
* @param beanRegistrationCode the bean registration code * @param beanRegistrationCode the bean registration code
* @return the generated code * @return the generated code
*/ */
public CodeBlock generateReturnCode(GenerationContext generationContext, public CodeBlock generateReturnCode(
BeanRegistrationCode beanRegistrationCode) { GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
return this.codeFragments.generateReturnCode(generationContext, return this.codeFragments.generateReturnCode(generationContext, beanRegistrationCode);
beanRegistrationCode);
} }
} }

View File

@ -32,9 +32,7 @@ import org.springframework.beans.factory.support.RegisteredBean;
class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProcessor { class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProcessor {
@Override @Override
public BeanRegistrationsAotContribution processAheadOfTime( public BeanRegistrationsAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
ConfigurableListableBeanFactory beanFactory) {
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory = BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory =
new BeanDefinitionMethodGeneratorFactory(beanFactory); new BeanDefinitionMethodGeneratorFactory(beanFactory);
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>(); Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();

View File

@ -815,13 +815,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
} }
BeanFactory parent = getParentBeanFactory(); BeanFactory parent = getParentBeanFactory();
if (parent instanceof DefaultListableBeanFactory dlfb) { if (parent instanceof DefaultListableBeanFactory dlbf) {
// No bean definition found in this factory -> delegate to parent. // No bean definition found in this factory -> delegate to parent.
return dlfb.isAutowireCandidate(beanName, descriptor, resolver); return dlbf.isAutowireCandidate(beanName, descriptor, resolver);
} }
else if (parent instanceof ConfigurableListableBeanFactory clfb) { else if (parent instanceof ConfigurableListableBeanFactory clbf) {
// If no DefaultListableBeanFactory, can't pass the resolver along. // If no DefaultListableBeanFactory, can't pass the resolver along.
return clfb.isAutowireCandidate(beanName, descriptor); return clbf.isAutowireCandidate(beanName, descriptor);
} }
else { else {
return true; return true;

View File

@ -320,7 +320,7 @@ public class RootBeanDefinition extends AbstractBeanDefinition {
* Specify a generics-containing target type of this bean definition, if known in advance. * Specify a generics-containing target type of this bean definition, if known in advance.
* @since 4.3.3 * @since 4.3.3
*/ */
public void setTargetType(ResolvableType targetType) { public void setTargetType(@Nullable ResolvableType targetType) {
this.targetType = targetType; this.targetType = targetType;
} }
@ -432,8 +432,8 @@ public class RootBeanDefinition extends AbstractBeanDefinition {
@Override @Override
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) { public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) {
super.setInstanceSupplier(instanceSupplier); super.setInstanceSupplier(instanceSupplier);
Method factoryMethod = (instanceSupplier instanceof InstanceSupplier<?>) Method factoryMethod = (instanceSupplier instanceof InstanceSupplier<?> ?
? ((InstanceSupplier<?>) instanceSupplier).getFactoryMethod() : null; ((InstanceSupplier<?>) instanceSupplier).getFactoryMethod() : null);
if (factoryMethod != null) { if (factoryMethod != null) {
setResolvedFactoryMethod(factoryMethod); setResolvedFactoryMethod(factoryMethod);
} }

View File

@ -166,6 +166,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
return RegisteredBean.of(beanFactory, "test"); return RegisteredBean.of(beanFactory, "test");
} }
static class MockBeanRegistrationExcludeFilter implements static class MockBeanRegistrationExcludeFilter implements
BeanRegistrationAotProcessor, BeanRegistrationExcludeFilter, Ordered { BeanRegistrationAotProcessor, BeanRegistrationExcludeFilter, Ordered {
@ -182,8 +183,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
} }
@Override @Override
public BeanRegistrationAotContribution processAheadOfTime( public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
RegisteredBean registeredBean) {
return null; return null;
} }

View File

@ -46,16 +46,13 @@ import org.springframework.lang.Nullable;
* *
* @author Brian Clozel * @author Brian Clozel
*/ */
class RuntimeHintsBeanFactoryInitializationAotProcessor class RuntimeHintsBeanFactoryInitializationAotProcessor implements BeanFactoryInitializationAotProcessor {
implements BeanFactoryInitializationAotProcessor {
private static final Log logger = LogFactory private static final Log logger = LogFactory.getLog(RuntimeHintsBeanFactoryInitializationAotProcessor.class);
.getLog(RuntimeHintsBeanFactoryInitializationAotProcessor.class);
@Override @Override
public BeanFactoryInitializationAotContribution processAheadOfTime( public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
ConfigurableListableBeanFactory beanFactory) {
Map<Class<? extends RuntimeHintsRegistrar>, RuntimeHintsRegistrar> registrars = AotServices Map<Class<? extends RuntimeHintsRegistrar>, RuntimeHintsRegistrar> registrars = AotServices
.factories(beanFactory.getBeanClassLoader()).load(RuntimeHintsRegistrar.class).stream() .factories(beanFactory.getBeanClassLoader()).load(RuntimeHintsRegistrar.class).stream()
.collect(LinkedHashMap::new, (map, item) -> map.put(item.getClass(), item), Map::putAll); .collect(LinkedHashMap::new, (map, item) -> map.put(item.getClass(), item), Map::putAll);

View File

@ -87,8 +87,7 @@ public class CglibProxyTests extends AbstractAopProxyTests implements Serializab
AdvisedSupport pc = new AdvisedSupport(ITestBean.class); AdvisedSupport pc = new AdvisedSupport(ITestBean.class);
pc.addAdvice(new NopInterceptor()); pc.addAdvice(new NopInterceptor());
AopProxy aop = createAopProxy(pc); AopProxy aop = createAopProxy(pc);
assertThatExceptionOfType(AopConfigException.class).isThrownBy( assertThatExceptionOfType(AopConfigException.class).isThrownBy(aop::getProxy);
aop::getProxy);
} }
@Test @Test

View File

@ -129,11 +129,11 @@ class TestClassScanner {
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
if (packageNames.length > 0) { if (packageNames.length > 0) {
logger.info("Scanning for Spring test classes in packages %s in classpath roots %s" logger.info("Scanning for Spring test classes in packages %s in classpath roots %s"
.formatted(Arrays.toString(packageNames), this.classpathRoots)); .formatted(Arrays.toString(packageNames), this.classpathRoots));
} }
else { else {
logger.info("Scanning for Spring test classes in all packages in classpath roots %s" logger.info("Scanning for Spring test classes in all packages in classpath roots %s"
.formatted(this.classpathRoots)); .formatted(this.classpathRoots));
} }
} }

View File

@ -45,6 +45,7 @@ class TransactionBeanRegistrationAotProcessor implements BeanRegistrationAotProc
private final static String JAKARTA_TRANSACTIONAL_CLASS_NAME = "jakarta.transaction.Transactional"; private final static String JAKARTA_TRANSACTIONAL_CLASS_NAME = "jakarta.transaction.Transactional";
@Override @Override
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) { public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
Class<?> beanClass = registeredBean.getBeanClass(); Class<?> beanClass = registeredBean.getBeanClass();
@ -68,6 +69,7 @@ class TransactionBeanRegistrationAotProcessor implements BeanRegistrationAotProc
}); });
} }
private static class TransactionBeanRegistrationAotContribution implements BeanRegistrationAotContribution { private static class TransactionBeanRegistrationAotContribution implements BeanRegistrationAotContribution {
private final Class<?> beanClass; private final Class<?> beanClass;
@ -84,7 +86,8 @@ class TransactionBeanRegistrationAotProcessor implements BeanRegistrationAotProc
return; return;
} }
for (Class<?> proxyInterface : proxyInterfaces) { for (Class<?> proxyInterface : proxyInterfaces) {
runtimeHints.reflection().registerType(proxyInterface, builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_METHODS)); runtimeHints.reflection().registerType(proxyInterface,
builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_METHODS));
} }
runtimeHints.proxies().registerJdkProxy(AopProxyUtils.completeJdkProxyInterfaces(proxyInterfaces)); runtimeHints.proxies().registerJdkProxy(AopProxyUtils.completeJdkProxyInterfaces(proxyInterfaces));
} }